reentrantlock類、synchronized關鍵字,屬於悲觀鎖。
可重入鎖,即遞迴鎖。指在同一執行緒內,外層函式獲得鎖之後,內層遞迴函式仍然可以獲得該鎖。
作用:防止在同一執行緒中多次獲取鎖而導致死鎖發生。
j**a.util.concurrent.atomic包下的atomicreference等原子類的使用,屬於樂觀鎖。
當乙個執行緒在獲取鎖的時候,如果鎖已經被其他執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷,鎖是否能夠被成功獲取,直到獲得鎖才會退出迴圈。
獲取鎖的執行緒一直處於活動狀態,但是並沒有執行任何有效的任務,使用這種鎖會造成busy-waiting。所以需要增加一些退出忙等的方法。
實現:cas。
缺點:cpu可能長時間極高,不釋放執行緒,不公平造成其他「執行緒飢餓」問題。cas操作可能存在aba的問題,就是說:假如乙個值原來是a,變成了b,又變成了a,那麼cas檢查時會發現它的值沒有發生變化,但是實際上卻變化了,如果執行緒不關心變數中途如何變化,那麼這個不是什麼問題;如果有些操作會依賴於物件的變化過程,此時的解決思路一般就是使用版本號,在變數前面追加上版本號,每次變數更新的時候把版本號加一,那麼a-b-a 就會變成1a - 2b - 3a。
例如:原子引用,以無鎖方式訪問共享資源
public class atomicreftest
for (thread thread : list)
system.out.println(atomref.get()); // 列印2000
}}class task implements runnable
@override
public void run()
}}
上述示例,最終列印「2000」。
該示例並沒有使用鎖,而是使用自旋+cas的無鎖操作保證共享變數的執行緒安全。1000個執行緒,每個執行緒對金額增加1,最終結果為2000,如果執行緒不安全,最終結果應該會小於2000。
總結:使用cas的套路:
atomicreferenceatomref = new atomicreference<>(new object());
object oldcache = atomref.get();
// 對快取oldcache做一些操作
object newcache = somefunctionofold(oldcache);
// 如果期間沒有其它執行緒改變了快取值,則更新
boolean success = atomref.compareandset(oldcache , newcache);
多執行緒常用方法介紹
可以返回 正在被那個執行緒呼叫的資訊 public class threadtest extends thread public static void main string args 執行結果 main方法是由乙個叫main的執行緒呼叫的 run方法是由乙個thrad 0方法呼叫的 isaliv...
Java多執行緒常用方法解析
sleep sleep 方法需要指定等待的時間,它可以讓當前正在執行的執行緒在指定的時間內暫停執行,進入阻塞狀態,該方法既可以讓其他同優先順序或者高優先順序的執行緒得到執行的機會,也可以讓低優先順序的執行緒得到執行機會。但是sleep 方法不會釋放 鎖標誌 也就是說如果有synchronized同步...
多執行緒系列三 執行緒常用方法
獲取當前執行緒 currentthread 該方法返回執行currentthread 這個方法當前執行緒的資訊 返回的是thread例項 使用這個方法可以獲取執行緒的名稱等 下面來看一下比較複雜的例子 public class threadmethodtest override public voi...