日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

深入Synchronized和java.util.concurrent.locks.Lock的区别详解

發(fā)布時間:2023/12/3 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入Synchronized和java.util.concurrent.locks.Lock的区别详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自??深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解

?

本篇文章是對Synchronized和java.util.concurrent.locks.Lock的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

主要相同點:Lock能完成Synchronized所實現(xiàn)的所有功能。
主要不同點:Lock有比Synchronized更精確的線程予以和更好的性能。
Synchronized會自動釋放鎖,但是Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。
synchronized 修飾方法時 表示同一個對象在不同的線程中 表現(xiàn)為同步隊列
如果實例化不同的對象 那么synchronized就不會出現(xiàn)同步效果了。
1.對象的鎖?
所有對象都自動含有單一的鎖。?
JVM負(fù)責(zé)跟蹤對象被加鎖的次數(shù)。如果一個對象被解鎖,其計數(shù)變?yōu)?。在任務(wù)(線程)第一次給對象加鎖的時候,計數(shù)變?yōu)?。每當(dāng)這個相同的任務(wù)(線程)在此對象上獲得鎖時,計數(shù)會遞增。?
只有首先獲得鎖的任務(wù)(線程)才能繼續(xù)獲取該對象上的多個鎖。?
每當(dāng)任務(wù)離開一個synchronized方法,計數(shù)遞減,當(dāng)計數(shù)為0的時候,鎖被完全釋放,此時別的任務(wù)就可以使用此資源。?
2.synchronized同步塊?
2.1同步到單一對象鎖?

當(dāng)使用同步塊時,如果方法下的同步塊都同步到一個對象上的鎖,則所有的任務(wù)(線程)只能互斥的進(jìn)入這些同步塊。?
Resource1.java演示了三個線程(包括main線程)試圖進(jìn)入某個類的三個不同的方法的同步塊中,雖然這些同步塊處在不同的方法中,但由于是同步到同一個對象(當(dāng)前對象 synchronized (this)),所以對它們的方法依然是互斥的。?
比如

class Test {public static User user=null;public synchronized void add(User u){user=u;Dao.save(user)} }

?


如果在線程1中?

?

Test test=new Test(); User u=new User(); u.setUserName(“l(fā)iaomin”); u.setUserPassword(“l(fā)iaomin”); Test.add(u);

如果在線程2中

Test tes1t=new Test(); User u1=new User(); u1.setUserName(“huqun”); u1.setUserPassword(“huqun”); Tes1t.add(u1);

那么 現(xiàn)在線程1 和線程2同時啟動 如果對象new的不是同一個Test
那么出現(xiàn)線程交叉的話 那么插入數(shù)據(jù)庫中的數(shù)據(jù)就是相同的
因為你的user變量時靜態(tài)的?? 你給他賦值第一次 假如還沒有save的時候
另外一個線程改變了user的值 那么第一個線程插入時也就是第二次賦予的值了

所以要實現(xiàn)同步 那么可以改方法為靜態(tài)的就能達(dá)到同步的效果了
修改如下

public static synchronized void add(User u) {user=u;Dao.save(user) }

修改為static的方法是存在于堆中
是全局方法 針對于所有實例化與未 實例化的對象只存在一個 所以會出現(xiàn)同步隊列

?

當(dāng)然不用static 也可以 那就用lock

?

class Test { public static User user=null; Lock lock=new ReentrantLock();Public void add(User u) { lock.lock();user=u;Dao.save(user); lock.unlock(); } }


這樣無論你new多少個對象都會是線程同步的
相當(dāng)于

public static synchronized void add(User u) {user=u;Dao.save(user) }

同時 lock性能上高于synchronized
只是lock需要手動關(guān)閉

?

總結(jié)

以上是生活随笔為你收集整理的深入Synchronized和java.util.concurrent.locks.Lock的区别详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。