国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

2020-11-11 16:30動(dòng)力節(jié)點(diǎn) Java教程

本文從synchronized、Lock到Java8新增的StampedLock進(jìn)行對比分析,對Java8新特性之StampedLock相關(guān)知識(shí)感興趣的朋友一起看看吧

Java8就像一個(gè)寶藏,一個(gè)小的API改進(jìn),也足與寫一篇文章,比如同步,一直是多線程并發(fā)編程的一個(gè)老話題,相信沒有人喜歡同步的代碼,這會(huì)降低應(yīng)用的吞吐量等性能指標(biāo),最壞的時(shí)候會(huì)掛起死機(jī),但是即使這樣你也沒得選擇,因?yàn)橐WC信息的正確性。所以本文決定將從synchronized、Lock到Java8新增的StampedLock進(jìn)行對比分析,相信StampedLock不會(huì)讓大家失望。

synchronized

在java5之前,實(shí)現(xiàn)同步主要是使用synchronized。它是Java語言的關(guān)鍵字,當(dāng)它用來修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼。

有四種不同的同步塊:

1.實(shí)例方法

2.靜態(tài)方法

3.實(shí)例方法中的同步塊

4.靜態(tài)方法中的同步塊

大家對此應(yīng)該不陌生,所以不多講了,以下是代碼示例

?
1
2
3
synchronized(this)
// do operation
}

小結(jié):在多線程并發(fā)編程中Synchronized一直是元老級(jí)角色,很多人都會(huì)稱呼它為重量級(jí)鎖,但是隨著Java SE1.6對Synchronized進(jìn)行了各種優(yōu)化之后,性能上也有所提升。

Lock

它是Java 5在java.util.concurrent.locks新增的一個(gè)API。

Lock是一個(gè)接口,核心方法是lock(),unlock(),tryLock(),實(shí)現(xiàn)類有ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock;

ReentrantReadWriteLock, ReentrantLock 和synchronized鎖都有相同的內(nèi)存語義。

與synchronized不同的是,Lock完全用Java寫成,在java這個(gè)層面是無關(guān)JVM實(shí)現(xiàn)的。Lock提供更靈活的鎖機(jī)制,很多synchronized 沒有提供的許多特性,比如鎖投票,定時(shí)鎖等候和中斷鎖等候,但因?yàn)閘ock是通過代碼實(shí)現(xiàn)的,要保證鎖定一定會(huì)被釋放,就必須將unLock()放到finally{}中

下面是Lock的一個(gè)代碼示例

?
1
2
3
4
5
6
rwlock.writeLock().lock();
try {
// do operation
} finally {
rwlock.writeLock().unlock();
}

小結(jié):比synchronized更靈活、更具可伸縮性的鎖定機(jī)制,但不管怎么說還是synchronized代碼要更容易書寫些

StampedLock

它是java8在java.util.concurrent.locks新增的一個(gè)API。

ReentrantReadWriteLock 在沒有任何讀寫鎖時(shí),才可以取得寫入鎖,這可用于實(shí)現(xiàn)了悲觀讀取(Pessimistic Reading),即如果執(zhí)行中進(jìn)行讀取時(shí),經(jīng)常可能有另一執(zhí)行要寫入的需求,為了保持同步,ReentrantReadWriteLock 的讀取鎖定就可派上用場。

然而,如果讀取執(zhí)行情況很多,寫入很少的情況下,使用 ReentrantReadWriteLock 可能會(huì)使寫入線程遭遇饑餓(Starvation)問題,也就是寫入線程吃吃無法競爭到鎖定而一直處于等待狀態(tài)。

StampedLock控制鎖有三種模式(寫,讀,樂觀讀),一個(gè)StampedLock狀態(tài)是由版本和模式兩個(gè)部分組成,鎖獲取方法返回一個(gè)數(shù)字作為票據(jù)stamp,它用相應(yīng)的鎖狀態(tài)表示并控制訪問,數(shù)字0表示沒有寫鎖被授權(quán)訪問。在讀鎖上分為悲觀鎖和樂觀鎖。

所謂的樂觀讀模式,也就是若讀的操作很多,寫的操作很少的情況下,你可以樂觀地認(rèn)為,寫入與讀取同時(shí)發(fā)生幾率很少,因此不悲觀地使用完全的讀取鎖定,程序可以查看讀取資料之后,是否遭到寫入執(zhí)行的變更,再采取后續(xù)的措施(重新讀取變更信息,或者拋出異常) ,這一個(gè)小小改進(jìn),可大幅度提高程序的吞吐量!!

下面是java doc提供的StampedLock一個(gè)例子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Point {
 private double x, y;
 private final StampedLock sl = new StampedLock();
 void move(double deltaX, double deltaY) { // an exclusively locked method
  long stamp = sl.writeLock();
  try {
  x += deltaX;
  y += deltaY;
  } finally {
  sl.unlockWrite(stamp);
  }
 }
 //下面看看樂觀讀鎖案例
 double distanceFromOrigin() { // A read-only method
  long stamp = sl.tryOptimisticRead(); //獲得一個(gè)樂觀讀鎖
  double currentX = x, currentY = y; //將兩個(gè)字段讀入本地局部變量
  if (!sl.validate(stamp)) { //檢查發(fā)出樂觀讀鎖后同時(shí)是否有其他寫鎖發(fā)生?
  stamp = sl.readLock(); //如果沒有,我們再次獲得一個(gè)讀悲觀鎖
  try {
   currentX = x; // 將兩個(gè)字段讀入本地局部變量
   currentY = y; // 將兩個(gè)字段讀入本地局部變量
  } finally {
   sl.unlockRead(stamp);
  }
  }
  return Math.sqrt(currentX * currentX + currentY * currentY);
 }
//下面是悲觀讀鎖案例
 void moveIfAtOrigin(double newX, double newY) { // upgrade
  // Could instead start with optimistic, not read mode
  long stamp = sl.readLock();
  try {
  while (x == 0.0 && y == 0.0) { //循環(huán),檢查當(dāng)前狀態(tài)是否符合
   long ws = sl.tryConvertToWriteLock(stamp); //將讀鎖轉(zhuǎn)為寫鎖
   if (ws != 0L) { //這是確認(rèn)轉(zhuǎn)為寫鎖是否成功
   stamp = ws; //如果成功 替換票據(jù)
   x = newX; //進(jìn)行狀態(tài)改變
   y = newY; //進(jìn)行狀態(tài)改變
   break;
   }
   else { //如果不能成功轉(zhuǎn)換為寫鎖
   sl.unlockRead(stamp); //我們顯式釋放讀鎖
   stamp = sl.writeLock(); //顯式直接進(jìn)行寫鎖 然后再通過循環(huán)再試
   }
  }
  } finally {
  sl.unlock(stamp); //釋放讀鎖或?qū)戞i
  }
 }
 }

小結(jié):

StampedLock要比ReentrantReadWriteLock更加廉價(jià),也就是消耗比較小。

StampedLock與ReadWriteLock性能對比

下圖是和ReadWritLock相比,在一個(gè)線程情況下,是讀速度其4倍左右,寫是1倍。

Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

下圖是六個(gè)線程情況下,讀性能是其幾十倍,寫性能也是近10倍左右:

Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

下圖是吞吐量提高:

Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

總結(jié)

1、synchronized是在JVM層面上實(shí)現(xiàn)的,不但可以通過一些監(jiān)控工具監(jiān)控synchronized的鎖定,而且在代碼執(zhí)行時(shí)出現(xiàn)異常,JVM會(huì)自動(dòng)釋放鎖定;

2、ReentrantLock、ReentrantReadWriteLock,、StampedLock都是對象層面的鎖定,要保證鎖定一定會(huì)被釋放,就必須將unLock()放到finally{}中;

3、StampedLock 對吞吐量有巨大的改進(jìn),特別是在讀線程越來越多的場景下;

4、StampedLock有一個(gè)復(fù)雜的API,對于加鎖操作,很容易誤用其他方法;

5、當(dāng)只有少量競爭者的時(shí)候,synchronized是一個(gè)很好的通用的鎖實(shí)現(xiàn);

6、當(dāng)線程增長能夠預(yù)估,ReentrantLock是一個(gè)很好的通用的鎖實(shí)現(xiàn);

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人精品一区二区三区福利 | 国产精品无码久久久久 | 日韩成人在线视频 | 日韩视频在线观看 | 精品国产一级毛片 | 午夜亚洲 | 成人精品久久久 | 一区二区av在线 | 日韩在线免费观看视频 | 国产的黄色片 | 国产区区| 日本三级视频 | 亚洲欧美视频 | 一本大道av日日躁夜夜躁 | 国产三级一区二区 | 亚洲一区二区在线播放 | 久久妇女高潮片免费观看 | 国产1级片| 永久在线观看 | 一区二区色 | 久久国产亚洲精品 | 亚洲成人一区 | 欧洲精品视频在线观看 | 久久精品国产亚洲精品 | 亚洲狠狠爱一区二区三区 | 亚洲成人在线观看视频 | 天堂va蜜桃一区二区三区漫画版 | 亚洲影视一区 | 爱爱免费视频网站 | 激情综合在线 | 国产啊v在线观看 | 成人激情视频免费在线观看 | 97国产精品| 日韩激情一区 | 精品久久久久久久久久久 | 中文字幕在线观看一区二区三区 | 一级毛片在线播放 | 五月婷婷丁香在线 | 欧美日韩一区二区三区不卡视频 | 精品无人乱码一区二区三区 | 婷婷久|