Java lock同步鎖使用實(shí)例解析
這篇文章主要介紹了Java lock同步鎖使用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
1)Lock是一個(gè)接口,而synchronized是Java中的關(guān)鍵字,synchronized是內(nèi)置的語言實(shí)現(xiàn),synchronized是在JVM層面上實(shí)現(xiàn)的,不但可以通過一些監(jiān)控工具監(jiān)控synchronized的鎖定,而且在代碼執(zhí)行時(shí)出現(xiàn)異常,JVM會(huì)自動(dòng)釋放鎖定,但是使用Lock則不行,lock是通過代碼實(shí)現(xiàn)的,要保證鎖定一定會(huì)被釋放,就必須將 unLock()放到finally{} 中;
2)synchronized在發(fā)生異常時(shí),會(huì)自動(dòng)釋放線程占有的鎖,因此不會(huì)導(dǎo)致死鎖現(xiàn)象發(fā)生;而Lock在發(fā)生異常時(shí),如果沒有主動(dòng)通過unLock()去釋放鎖,則很可能造成死鎖現(xiàn)象,因此使用Lock時(shí)需要在finally塊中釋放鎖;
3)Lock可以讓等待鎖的線程響應(yīng)中斷,線程可以中斷去干別的事務(wù),而synchronized卻不行,使用synchronized時(shí),等待的線程會(huì)一直等待下去,不能夠響應(yīng)中斷;
4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。
5)Lock可以提高多個(gè)線程進(jìn)行讀操作的效率。
在性能上來說,如果競(jìng)爭(zhēng)資源不激烈,兩者的性能是差不多的,而當(dāng)競(jìng)爭(zhēng)資源非常激烈時(shí)(即有大量線程同時(shí)競(jìng)爭(zhēng)),此時(shí)Lock的性能要遠(yuǎn)遠(yuǎn)優(yōu)于synchronized。所以說,在具體使用時(shí)要根據(jù)適當(dāng)情況選擇。
package lock;
/*
方式三:
Lock鎖
synchronized和lock的不同
1.sychronized在執(zhí)行完相應(yīng)代碼塊以后屬于自動(dòng)釋放同步監(jiān)視器,lock需要手動(dòng)啟動(dòng)同步
建議優(yōu)先使用lock->同步方法塊->同步方法(在方法體之外)
實(shí)現(xiàn)Runnable對(duì)象被三個(gè)線程調(diào)用,然后這個(gè)對(duì)象的run方法里貢獻(xiàn)資源操作器被lock上鎖了
@author zsben
@create 2020-01-03 23:55
*/
import java.util.concurrent.locks.ReentrantLock;
class Window implements Runnable{
private int ticket = 100;
//1.實(shí)例化lock
private ReentrantLock lock = new ReentrantLock(true);//fair=true:公平鎖,線程先來后到
@Override
public void run() {
while(true){
try{
//2.調(diào)用lock方法
lock.lock();
if(ticket>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+": "+ticket);
ticket--;
}else break;
}
finally {
//3.調(diào)用解鎖方法
lock.unlock();
}
}
}
}
public class LockTest {
public static void main(String[] args) {
Window w = new Window();
Thread t1 = new Thread(w);
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.start();
t2.start();
t3.start();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java并發(fā)編程專題(四)----淺談(JUC)Lock鎖
- Java Lock鎖多線程中實(shí)現(xiàn)流水線任務(wù)
- Java多線程 ReentrantLock互斥鎖詳解
- Javas使用Redlock實(shí)現(xiàn)分布式鎖過程解析
- java同步之如何寫一個(gè)鎖Lock
- 詳解java并發(fā)之重入鎖-ReentrantLock
- Java鎖機(jī)制Lock用法示例
- 深入理解java內(nèi)置鎖(synchronized)和顯式鎖(ReentrantLock)
- java基于jedisLock—redis分布式鎖實(shí)現(xiàn)示例代碼
- 詳解Java多線程編程中互斥鎖ReentrantLock類的用法
- Java多線程編程之讀寫鎖ReadWriteLock用法實(shí)例
- 淺析JAVA Lock鎖原理
相關(guān)文章
Java實(shí)現(xiàn)向數(shù)組里添加元素
這篇文章主要介紹了Java實(shí)現(xiàn)向數(shù)組里添加元素方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Kafka在客戶端實(shí)現(xiàn)消息的發(fā)送與讀取
這篇文章主要介紹了Kafka在客戶端實(shí)現(xiàn)消息的發(fā)送與讀取,KafkaProducer是用于發(fā)送消息的類,ProducerRecord類用于封裝Kafka的消息,KafkaProducer的實(shí)例化需要指定的參數(shù),Producer的參數(shù)定義在 org.apache.kafka.clients.producer.ProducerConfig類中,需要的朋友可以參考下2023-12-12
Java Thread多線程開發(fā)中Object類詳細(xì)講解
這篇文章主要介紹了Java Thread多線程開發(fā)中Object類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03
Java利用Map實(shí)現(xiàn)計(jì)算文本中字符個(gè)數(shù)
這篇文章主要為大家詳細(xì)介紹了Java如何利用Map集合實(shí)現(xiàn)計(jì)算文本中字符個(gè)數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08
springboot后端使用LocalDate接收日期的問題解決
在做Java開發(fā)時(shí),肯定會(huì)碰到傳遞時(shí)間參數(shù)的情況,本文主要介紹了springboot后端使用LocalDate接收日期的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Mybatis-plus插入數(shù)據(jù)遇到主鍵沒有默認(rèn)值的情況
這篇文章主要介紹了Mybatis-plus插入數(shù)據(jù)遇到主鍵沒有默認(rèn)值的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

