<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在Java中除了synchronized關鍵字可以實現物件鎖之外,java.util.concurrent中的Lock介面也可以實現物件鎖。
介紹一下這個lock鎖的簡要實現:
注:使用Lock介面需要顯式的進行加鎖和解鎖操作。
我們可以使用Lock介面的實現子類ReentrantLock來進行加鎖解鎖:
ReentrantLock 可重入互斥鎖. 和 synchronized 定位類似, 都是用來實現互斥效果, 保證執行緒安全.
ReentrantLock 的用法:
lock()
: 加鎖,獲取鎖失敗的執行緒進入阻塞狀態,直到其他執行緒釋放鎖,再次競爭,死等。trylock
(超時時間): 加鎖, 獲取鎖失敗的執行緒進入阻塞態,等待一段時間,時間過了若還未獲取到鎖恢復執行,放棄加鎖,執行其他程式碼unlock()
: 解鎖synchronized和lock的區別:
synchronized
是Java的關鍵字, 由 JVM 實現,需要依賴作業系統提供的執行緒互斥原語(mutex),而Lock
標準庫的類和介面,其中一個最常用的子類( ReentrantLock ,可重入鎖),由Java本身實現的,不需要依賴作業系統。
synchronized
隱式的加鎖和解鎖,lock
需要顯示進行加鎖和解鎖
synchronized
在獲取鎖失敗的執行緒時,死等;lock
可以使用trylock
等待一段時間之後自動放棄加鎖,執行緒恢復執行
synchronized
是非公平鎖, ReentrantLock
預設是非公平鎖. 可以通過構造方法傳入一個 true
開啟公平鎖模式.
synchronized
不支援讀寫鎖,Lock
子類ReentrantReadWriteLock
支援讀寫鎖。
更強大的喚醒機制. synchronized
是通過 Object 的 wait / notify
實現等待-喚醒. 每次喚醒的是一個隨機等待的執行緒.ReentrantLock
搭配 Condition
類實現等待-喚醒, 可以更精確控制喚醒某個指定的執行緒
小結:
一般場景synchronized足夠用了,需要用超時等待鎖,公平鎖,讀寫鎖再考慮使用juc.lock
如何選擇使用哪個鎖?
原子類內部用的是 CAS 實現,所以效能要比加鎖實現 i++ 高很多。原子類有以下幾個:
以 AtomicInteger 舉例,常見方法有:
addAndGet(int delta); i += delta; decrementAndGet(); --i; getAndDecrement(); i--; incrementAndGet(); ++i; getAndIncrement(); i++;
juc包下一共有四個常用工具類:
號誌Semaphore就是一個計數器,表示當前可用資源的個數
關於號誌Semaphore有兩個核心操作:
Semaphore 的PV加減操作都是原子性的,再多執行緒場景下可以直接使用
public static void main(String[] args) { // 在構造引數傳入可用資源的個數 // 可用資源為6個 Semaphore semaphore = new Semaphore(6); Runnable runnable = new Runnable() { @Override public void run() { try { System.out.println(Thread.currentThread().getName() + "準備申請資源"); // P操作,每次申請兩個資源 semaphore.acquire(2); System.out.println(Thread.currentThread().getName() + "獲取資源成功"); Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + "釋放資源"); // V操作,預設釋放一個佔有的資源 semaphore.release(2); }catch (InterruptedException e) { e.printStackTrace(); } } }; for (int i = 0; i < 20; i++) { Thread t = new Thread(runnable,String.valueOf(i + 1)); t.start(); } }
有點類似於大號的join方法
呼叫await方法的執行緒需要等待其他執行緒將計數器減為0才能繼續恢復執行。
public static void main(String[] args) throws InterruptedException { // 等待執行緒需要等待的執行緒數,必須等這10個子執行緒全部執行完畢再恢復執行 CountDownLatch latch = new CountDownLatch(10); Runnable runnable = new Runnable() { @Override public void run() { try { Thread.sleep(new Random().nextInt(1000)); System.out.println(Thread.currentThread().getName() + "到達終點"); // 計數器 - 1 latch.countDown(); }catch (InterruptedException e) { e.printStackTrace(); } } }; for (int i = 0; i < 10; i++) { Thread t = new Thread(runnable,"運動員" + i + 1); t.start(); } // main執行緒就是裁判執行緒,需要等待所有運動員到底終點再恢復執行 // 直到所有執行緒呼叫countdown方法將計數器減為0繼續執行 latch.await(); System.out.println("比賽結束~最終獲勝的是鵬哥,有請冠軍給大家高歌一首~"); }
至於CyclicBarrier和Exchanger在本篇就不多介紹,讀者可以自行查閱一下官方檔案進行仔細的學習~如果有問題可以私信博主,別忘了點贊收藏+關注哦!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45