国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java 多線程Synchronized和Lock的區(qū)別

瀏覽:24日期:2022-08-18 18:10:52
引言

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

區(qū)別

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

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

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

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

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

6、Lock可以使用讀鎖提高多線程讀效率

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

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

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

public class LockTest { private Lock lock = new ReentrantLock(); private void method(Thread thread) { lock.lock(); try { System.out.println(thread.getName() + ' has gotten the lock!'); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println(thread.getName() + ' has unlocked the lock!'); lock.unlock(); } } public static void main(String[] args) { final LockTest test = new LockTest(); Thread t1 = new Thread(new Runnable() { @Override public void run() {test.method(Thread.currentThread()); } }, 't1'); Thread t2 = new Thread(new Runnable() { @Override public void run() {test.method(Thread.currentThread()); } }, 't2'); t1.start(); t2.start(); }}

運(yùn)行結(jié)果:

t1 has gotten the lock!t1 has unlocked the lock!t2 has gotten the lock!t2 has unlocked the lock!tryLock():

public class LockTest { private Lock lock = new ReentrantLock(); private void method(Thread thread) { if (lock.tryLock()) { lock.lock(); try {System.out.println(thread.getName() + ' has gotten the lock!'); } catch (Exception e) {e.printStackTrace(); } finally {System.out.println(thread.getName() + ' has unlocked the lock!');lock.unlock(); } } else { System.out.println('I’m '+thread.getName()+'. Someone has gotten the lock!'); } } public static void main(String[] args) { LockTest test = new LockTest(); Thread t1 = new Thread(() -> test.method(Thread.currentThread()), 't1'); Thread t2 = new Thread(new Runnable() { @Override public void run() {test.method(Thread.currentThread()); } }, 't2'); t1.start(); t2.start(); }}

運(yùn)行結(jié)果:

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í)間,在測(cè)試代碼中寫入一個(gè)等待時(shí)間,后者主要是等待中斷,會(huì)拋出一個(gè)中斷異常,常用度不高,喜歡探究可以自己深入研究。

以上就是Java 多線程Synchronized和Lock的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Java 多線程Synchronized和Lock的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产在线欧美日韩精品一区二区 | 国产亚洲精品网站 | 一区二区三区在线免费观看视频 | 久草免费在线观看视频 | 免费看一毛一级毛片视频 | 香蕉视频1024| 国产一级一片免费播放 | 日韩欧美在线视频观看 | 日韩欧美在线视频观看 | julia中文字幕久久亚洲 | 中国美女隐私无遮挡免费视频 | 久草青草 | 国产一级免费 | 免费一级毛片在线播放视频 | 欧美激情精品久久久久久久久久 | 欧美性色黄在线视 | 成人国产在线看不卡 | 国产在线91精品天天更新 | 成人在线视频国产 | 91免费高清视频 | 免费国产成人手机在线观看 | 成人精品一区二区激情 | 日本一级毛片免费播放 | 日韩亚洲欧美在线 | 毛片毛片毛是个毛毛片 | 日本免费一区二区三区看片 | 国产欧美日韩精品一区二区三区 | 欧美日韩成人在线视频 | 成人av手机在线观看 | 国产高清一区二区三区 | 日本一级在线播放线观看免 | 日本作爱 | 国产精品爱久久久久久久9999 | 怡红院视频在线 | 日本久久久久久久久久 | 免费观看欧美一级毛片 | 欧美一级毛片俄罗斯 | 国产在线精品福利91香蕉 | 97在线观看 | 在线观看欧美一区 | 免费一级视频在线播放 |