Lock鎖(重點(diǎn))
傳統(tǒng)的synchronized
傳統(tǒng)的解決多線程并發(fā)導(dǎo)致的一些問(wèn)題我們會(huì)使用synchronized關(guān)鍵字來(lái)解決,synchronized的本質(zhì)就是隊(duì)列、鎖。
Lock的實(shí)現(xiàn)類有:可重復(fù)鎖(最常用)、讀鎖、寫鎖
在創(chuàng)建可重復(fù)鎖時(shí),可傳入boolean類型值來(lái)決定該鎖是公平鎖(先來(lái)后到)還是非公平鎖(可插隊(duì))。
三部曲
1、創(chuàng)建一個(gè)鎖
Lock lock = new ReentrantLock(true);
2、加鎖
lock.lock();
3、將業(yè)務(wù)代碼塊包裹在try{}cath(){}finally{lock.unlock();}中
try {
if (number>0){
System.out.println(Thread.currentThread().getName()+":賣出了第"+ number-- +"張票;"+"剩余"+number+"張票");
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
完整給一個(gè)業(yè)務(wù)加鎖
class Ticket2{
private int number = 50;
Lock lock = new ReentrantLock(true);
public void sale(){
lock.lock();
try {
if (number>0){
System.out.println(Thread.currentThread().getName()+":賣出了第"+ number-- +"張票;"+"剩余"+number+"張票");
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
公平鎖結(jié)果
非公平鎖結(jié)果
從結(jié)果上看,非公平鎖和synchronized關(guān)鍵字效果一樣。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-739654.html
- 小知識(shí):for循環(huán)中的業(yè)務(wù)邏輯只有一條的時(shí)候可以簡(jiǎn)化大括號(hào),直接將業(yè)務(wù)邏輯卸載后面通過(guò)分號(hào)結(jié)束。
synchronized和Lock鎖的區(qū)別文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-739654.html
- synchronized是關(guān)鍵字,Lock鎖是java的一個(gè)類
- synchronized無(wú)法判斷鎖的狀態(tài),Lock鎖可以判斷是否獲取到了鎖
- synchronized是自動(dòng)的,執(zhí)行完之后會(huì)自動(dòng)釋放鎖;Lock鎖必須要手動(dòng)釋放鎖!如果不釋放鎖,會(huì)導(dǎo)致死鎖
- synchronized 線程1(獲得鎖,阻塞)、線程2(等待,傻等死等);Lock鎖在其他線程獲得鎖阻塞后不一定會(huì)一直等待下去??梢酝ㄟ^(guò)tryLock來(lái)嘗試獲得鎖。
- synchronized 可重入鎖,不可以中斷,非公平鎖;Lock 可重入鎖,可以判斷鎖、可以自己設(shè)置是否公平
- synchronized 適合鎖少量的代碼同步問(wèn)題;Lock 適合鎖大量的代碼同步
到了這里,關(guān)于JUC并發(fā)編程學(xué)習(xí)筆記(二)Lock鎖(重點(diǎn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!