通過實例解析synchronized和lock區(qū)別
1,原始構(gòu)成
synchronized是關(guān)鍵字,屬于JVM層面,通過wait,notify和notifyAll來調(diào)度線程。
Lock是具體類,是api層面的鎖。
2,使用方法
synchronized不需要用戶手動去釋放鎖, 當synchronized代碼執(zhí)行完后,系統(tǒng)會自動釋放鎖。
Lock需要用戶手動釋放鎖,否則會出現(xiàn)死鎖現(xiàn)象。需要lock和unlock配合try/finally語句塊來完成。
3,等待是否中斷
synchronized不可中斷,除非拋出異?;蛘哒_\行完畢。
Lock可中斷,可以設(shè)置超時方法或者調(diào)用中斷方法。
4,加鎖是否公平
synchronized非公平鎖。
Lock默認非公平鎖,可指定為公平鎖。
5,鎖綁定多個條件condition
synchronized沒有。
Lock用來分組喚醒需要喚醒的線程,可以精確喚醒,而不是像synchronized一樣要么隨機喚醒一個線程,要么全部喚醒。
Demo: 練習
多線程之間按順序調(diào)用,實現(xiàn)A->B->C三個線程啟動,要求:AA打印5次,BB打印10次,CC打印15次,重復(fù)10遍。
package com.demo.lock;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ShareResource{
int number = 1;
private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void print5(){
lock.lock();
try {
while(number!=1){
c1.await();
}
for(int i=1;i<=5;i++){
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
number = 2;
c2.signal();
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void print10(){
lock.lock();
try {
while(number!=2){
c2.await();
}
for(int i=1;i<=10;i++){
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
number = 3;
c3.signal();
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void print15(){
lock.lock();
try {
while(number!=3){
c3.await();
}
for(int i=1;i<=15;i++){
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
number = 1;
c1.signal();
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
public class TestReentrantLock {
public static void main(String[] args) {
ShareResource shareResource = new ShareResource();
new Thread(()->{
for(int i=1;i<=10;i++){
shareResource.print5();
}
},"AA").start();
new Thread(()->{
for(int i=1;i<=10;i++){
shareResource.print10();
}
},"BB").start();
new Thread(()->{
for(int i=1;i<=10;i++){
shareResource.print15();
}
},"CC").start();
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
- 深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解
- 詳談Lock與synchronized 的區(qū)別
- Java編程synchronized與lock的區(qū)別【推薦】
- 簡單了解synchronized和lock的區(qū)別
- 淺談Synchronized和Lock的區(qū)別
- Java 多線程Synchronized和Lock的區(qū)別
- 淺談Java中Lock和Synchronized的區(qū)別
- Java常用鎖synchronized和ReentrantLock的區(qū)別
- synchronized?和?Lock?的異同點(如何讓選擇)
相關(guān)文章
解析和解決org.springframework.beans.factory.NoSuchBeanDefinitionE
這篇文章主要介紹了解析和解決org.springframework.beans.factory.NoSuchBeanDefinitionException異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
Guava自動加載緩存LoadingCache使用實戰(zhàn)詳解
這篇文章主要為大家介紹了Guava自動加載緩存LoadingCache使用實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼
這篇文章主要介紹了Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。2017-10-10
Spring AI 使用本地 Ollama Embeddings的操作方法
使用 OpenAI 的 Embeddings 接口是有費用的,如果想對大量文檔進行測試,使用本地部署的 Embeddings 就能省去大量的費用,所以我們嘗試使用本地的 Ollama Embeddings,這篇文章主要介紹了Spring AI 使用本地 Ollama Embeddings,需要的朋友可以參考下2024-05-05

