java 併發程式設計 顯示鎖和CAS

2021-09-19 06:35:51 字數 2081 閱讀 7110

lock 介面可以提供一些sychnoized 不具備的一些其他特性 如:

1。 嘗試非阻塞去獲取鎖

2. 可以被終端的獲取鎖

3. 超時獲取鎖

lock 介面的核心方法

lock():獲取鎖, 類似sychnonized 關鍵字

unlock():釋放鎖(當退出synchnonized 關鍵字所包圍的**塊的時候, 鎖自動釋放)

trylock(): 嘗試非阻塞的去獲取鎖, 獲得鎖返回true, 沒有返回false

顯示鎖的使用方法

lock lock = new reentranlock()

lock.lock()

tryfinally

排它鎖在同一時刻只允許乙個執行緒訪問

readwritelock lock = new reentrantreadwritelock()

lock getlock = lock.readlock()// 讀鎖

lock setlock = lock.writelock()// 讀鎖

**示例:

比synchnonized 鎖更快

lock 介面不能和wait notify 等方法相結合實現等待。 所以有了condition 介面實現等待和通知

使用方法:

lock kmlock= new reentrantreadwritelock()

condition kmcond= kmlock.newcondition();

kmcond.signal(); kmcond.signalall(); 通知其他在鎖上等待的執行緒。 盡量使用signal, 因為知道是哪個鎖, 只通知這個鎖上的執行緒即可

kmcond.await()// 當前執行緒進行等待

**示例:

比較並且交換。 三個運算子: 乙個記憶體位址v, 乙個期望的舊值a, 乙個新值b

檢查記憶體位址v 上的值, 是不是期望的a 值, 如果是, 就把位址v的變成b, 如果不是a , 則v 的值不變

cas 帶來的問題:

aba : 位址v 的值從 a–》c–>a 時, 我們檢查的時候, 發現a-a 沒有變, 但實際上c 已經過去了, 它的值已經變了, 不是原來的a 了

解決: 版本號:1a–》2c–>3a 來控制

使用atomicstampedreference 自帶版本戳原子操作類

示例**:

2. 迴圈時間長, 開銷大

3. 往往只能保證乙個共享變數的原子操作

示例**:

ai.getandincrement(), get 在前, 表示, 先返回變數裡面已有的值, get 在後返回變數操作完之後的新值

java併發 CAS原理學習 樂觀鎖 悲觀鎖

在之前文章中驗證了在多執行緒場景下,cas可以保證共享變數的原子性。此篇文章主要記錄一下cas原理的學習感悟。在一般情況下,為保證資料安全性,我們可以採用synchronized修飾變數或者修飾方法。也就是說在同一時間只有乙個執行緒能修改共享變數或者訪問這個方法,其它執行緒都要等待。但是這樣的話,也...

Java併發程式設計基礎 鎖

1 悲觀鎖和樂觀鎖 悲觀鎖 在sql語句末尾加上for update 樂觀鎖 在sql的where語句中新增version條件 update tablel set name and version 樂觀鎖並不會使用資料庫提供的鎖機制,一般在表中新增version 宇段或者使用業務 狀態來實現。樂觀鎖...

併發程式設計(五) CAS

在atomic包中,大多數類都是借助unsafe類來實現的,如以下 public static atomicinteger count new atomicinteger 0 private static void add incrementandget 方法的實現如下 public final i...