欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Synchronized和Lock的區別

引言

  在多線(xiàn)程中,為了使線(xiàn)程安全,我們經(jīng)常會(huì )使用synchronized和Lock進(jìn)行代碼同步和加鎖,但是具體兩者有什么區別,什么場(chǎng)景下適合用什么可能還不大清楚,主要的區別大致如下:

區別

    1、synchronized是java關(guān)鍵字,而Lock是java中的一個(gè)接口

    2、synchronized會(huì )自動(dòng)釋放鎖,而Lock必須手動(dòng)釋放鎖

    3、synchronized是不可中斷的,Lock可以中斷也可以不中斷

   4、通過(guò)Lock可以知道線(xiàn)程有沒(méi)有拿到鎖,而synchronized不能

    5、synchronized能鎖住方法和代碼塊,而Lock只能鎖住代碼塊

    6、Lock可以使用讀鎖提高多線(xiàn)程讀效率

    7、synchronized是非公平鎖,ReentranLock可以控制是否公平鎖

 

    起初 java 中只有 synchronized 這一種對程序加鎖的方式,在 java SE5 之后加入了 Lock 接口(以及相關(guān)實(shí)現類(lèi))用來(lái)實(shí)現鎖的功能,它提供了與 synchronized 關(guān)鍵字類(lèi)似的同步功能,只是在使用時(shí)需要顯式的獲取和釋放鎖,兩者的邏輯結構如下。
 1 Object objlock = new Object();
 2 synchronized(objlock) { //加鎖
 3     //... 邏輯 ...
 4 } //解鎖
 5 
 6 
 7 Lock lock = new ReentrantLock();
 8 lock.lock(); //加鎖
 9 try {
10     //... 邏輯 ...
11 } finally {
12     lock.unlock(); //解鎖
13 }

 

從Lock接口中我們可以看到主要有5個(gè)方法,這些方法的功能從注釋中可以看出:

1 lock():獲取鎖,如果鎖被暫用則一直等待 
2 unlock():釋放鎖 
3 tryLock(): 注意返回類(lèi)型是boolean,如果獲取鎖的時(shí)候鎖被占用就返回false,否則返回true
4 tryLock(long time, TimeUnit unit):比起tryLock()就是給了一個(gè)時(shí)間期限,保證等待參數時(shí)間 
5 lockInterruptibly():用該鎖的獲得方式,如果線(xiàn)程在獲取鎖的階段進(jìn)入了等待,那么可以中斷此線(xiàn)程,先去做別的事   通過(guò) 以上的解釋?zhuān)笾驴梢越忉屧谏蟼€(gè)部分中“鎖類(lèi)型(lockInterruptibly())”,“鎖狀態(tài)(tryLock())”等問(wèn)題,還有就是前面子所獲取的過(guò)程我所寫(xiě)的“大致就是可以嘗試獲得鎖,線(xiàn)程可以不會(huì )一直等待”用了“可以”的原因。

lock():

 1 public class LockTest {
 2     private Lock lock = new ReentrantLock();
 3 
 4     private void method(Thread thread) {
 5         lock.lock();
 6         try {
 7             System.out.println(thread.getName() + " has gotten the lock!");
 8         } catch (Exception e) {
 9             e.printStackTrace();
10         } finally {
11             System.out.println(thread.getName() + " has unlocked the lock!");
12             lock.unlock();
13         }
14     }
15 
16     public static void main(String[] args) {
17         final LockTest test = new LockTest();
18 
19         Thread t1 = new Thread(new Runnable() {
20             @Override
21             public void run() {
22                 test.method(Thread.currentThread());
23             }
24         }, "t1");
25         Thread t2 = new Thread(new Runnable() {
26             @Override
27             public void run() {
28                 test.method(Thread.currentThread());
29             }
30         }, "t2");
31         t1.start();
32         t2.start();
33     }
34 
35 }

運行結果:

t1 has gotten the lock!
t1 has unlocked the lock!
t2 has gotten the lock!
t2 has unlocked the lock!

 

tryLock():

 1 public class LockTest {
 2     private Lock lock = new ReentrantLock();
 3 
 4     private void method(Thread thread) {
 5     
 6         if (lock.tryLock()) {
 7             lock.lock();
 8             try {
 9                 System.out.println(thread.getName() + " has gotten the lock!");
10             } catch (Exception e) {
11                 e.printStackTrace();
12             } finally {
13                 System.out.println(thread.getName() + " has unlocked the lock!");
14                 lock.unlock();
15             }
16         } else {
17             System.out.println("I'm "+thread.getName()+". Someone has gotten the lock!");
18         }
19     }
20 
21     public static void main(String[] args) {
22         LockTest test = new LockTest();
23 
24         Thread t1 = new Thread(() -> test.method(Thread.currentThread()), "t1");
25         Thread t2 = new Thread(new Runnable() {
26             @Override
27             public void run() {
28                 test.method(Thread.currentThread());
29             }
30         }, "t2");
31         t1.start();
32         t2.start();
33     }
34 }

運行結果:

t1 has gotten the lock!
t1 has unlocked the lock!
I'm t2. Someone has gotten the lock!

看到這里相信大家也都會(huì )使用如何使用Lock了吧,關(guān)于tryLock(long time, TimeUnit unit)和lockInterruptibly()不再贅述。前者主要存在一個(gè)等待時(shí)間,在測試代碼中寫(xiě)入一個(gè)等待時(shí)間,后者主要是等待中斷,會(huì )拋出一個(gè)中斷異常,常用度不高,喜歡探究可以自己深入研究。

 

  • 公平鎖:是指多個(gè)線(xiàn)程按照申請鎖的順序來(lái)獲取鎖。
  • 非公平鎖:是指多個(gè)線(xiàn)程獲取鎖的順序并不是按照申請鎖的順序,有可能后申請的線(xiàn)程比先申請的線(xiàn)程優(yōu)先獲取鎖。有可能,會(huì )造成優(yōu)先級反轉或者饑餓現象。
  • 可重入鎖:是指可重復可遞歸調用的鎖,在外層使用鎖之后,在內層仍然可以使用,并且不發(fā)生死鎖(前提是同一個(gè)對象或者class),這樣的鎖就叫做可重入鎖。Lock和synchronized都是可重入鎖
  • 獨享鎖 :該鎖每一次只能被一個(gè)線(xiàn)程所持有。
  • 共享鎖 :該鎖可被多個(gè)線(xiàn)程共有,典型的就是ReentrantReadWriteLock里的讀鎖,它的讀鎖是可以被共享的,但是它的寫(xiě)鎖確每次只能被獨占。
  • 互斥鎖 :在訪(fǎng)問(wèn)共享資源之前對其進(jìn)行加鎖操作,在訪(fǎng)問(wèn)完成之后進(jìn)行解鎖操作。 加鎖后,任何其他試圖再次加鎖的線(xiàn)程會(huì )被阻塞,直到當前進(jìn)程解鎖。
  • 讀寫(xiě)鎖 :讀寫(xiě)鎖既是互斥鎖,又是共享鎖,read模式是共享,write是互斥(排它鎖)的
  • 樂(lè )觀(guān)鎖:總是假設最壞的情況,每次去拿數據的時(shí)候都認為別人會(huì )修改,所以每次在拿數據的時(shí)候都會(huì )上鎖,這樣別人想拿這個(gè)數據就會(huì )阻塞直到它拿到鎖
  • 悲觀(guān)鎖:總是假設最好的情況,每次去拿數據的時(shí)候都認為別人不會(huì )修改,所以不會(huì )上鎖,但是在更新的時(shí)候會(huì )判斷一下在此期間別人有沒(méi)有去更新這個(gè)數據,可以使用版本號機制和CAS算法實(shí)現。
  • 偏向鎖:是指一段同步代碼一直被一個(gè)線(xiàn)程所訪(fǎng)問(wèn),那么該線(xiàn)程會(huì )自動(dòng)獲取鎖。降低獲取鎖的代價(jià)。
  • 輕量級鎖:是指當鎖是偏向鎖的時(shí)候,被另一個(gè)線(xiàn)程所訪(fǎng)問(wèn),偏向鎖就會(huì )升級為輕量級鎖,其他線(xiàn)程會(huì )通過(guò)自旋的形式嘗試獲取鎖,不會(huì )阻塞,提高性能。
  • 重量級鎖:是指當鎖為輕量級鎖的時(shí)候,另一個(gè)線(xiàn)程雖然是自旋,但自旋不會(huì )一直持續下去,當自旋一定次數的時(shí)候,還沒(méi)有獲取到鎖,就會(huì )進(jìn)入阻塞,該鎖膨脹為重量級鎖。重量級鎖會(huì )讓其他申請的線(xiàn)程進(jìn)入阻塞,性能降低。
  • 自旋鎖:是指當一個(gè)線(xiàn)程在獲取鎖的時(shí)候,如果鎖已經(jīng)被其它線(xiàn)程獲取,那么該線(xiàn)程將循環(huán)等待,然后不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖才會(huì )退出循環(huán) 。

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
《Java并發(fā)編程從入門(mén)到精通》顯示鎖Lock和ReentrantLock | 并發(fā)編程網(wǎng)
JDK的鎖Synchronized、ReentrantLock與讀寫(xiě)鎖
一篇好文,帶你深入了解Lock鎖 !
系統梳理一下鎖
Java并發(fā)編程:Lock
Java并發(fā)入門(mén)原理教程(五)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久