日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java多线程同步与死锁,廖雪峰Java11多线程编程-2线程同步-3死锁

發布時間:2024/9/3 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程同步与死锁,廖雪峰Java11多线程编程-2线程同步-3死锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在多線程編程中,要執行synchronized塊,必須首先獲得指定對象的鎖。

1.Java的線程鎖是可重入的鎖

public void add(int m){

synchronized (lock){

this.value += m;

}

}

什么叫可重入的鎖? 對同一個對象,同一個線程,可以多次獲取它的鎖,即同一把鎖可以嵌套。 在add方法中,用synchronized獲取了一個lock對象的鎖,在synchronized代碼塊內部,調用another方法,可以再次獲取到lock對象的鎖。因為這是同一個線程對lock對象獲取鎖,所以它是一種可重入的鎖。

public void add(int m){

synchronized (lock){

this.value += m;

another(m);

}

}

public void addAnother(int m){

synchronized (lock){

this.another += m;

}

}

//上述代碼可以合并為

public void add(int m){

synchronized (lock){

this.value += m;

synchronized (lock){

this.another += m;

}

}

}

2. Java的線程還可以獲取多個不同對象的鎖

先用synchronized(lockA)獲得lockA的鎖,在用synchronized(lockB)獲得lockB的鎖。在釋放鎖的時候,會依次釋放lockB的鎖,再釋放lockA的鎖。

public void add(int m){

synchronized (lockA){//獲取lockA的鎖

this.value += m;

synchronized (LockB){//獲取lockB的鎖

this.another += m;

}//釋放lockB的鎖

}//釋放lockA的鎖

}

3.死鎖

不同的線程獲取多個不同對象的鎖可能導致死鎖 線程1和線程2分別執行。 線程1獲取lockA的鎖,線程2獲得lockB的鎖。 線程1執行語句,線程2執行語句。 線程1等待lockB的鎖,線程2等待lockA的鎖。這個時候,線程1和線程2會永遠等待下去,誰也無法繼續執行,就形成了死鎖。 死鎖形成的條件:

兩個線程各自持有不同的鎖。線程1持有A鎖,線程2持有B鎖。

兩個線程各自試圖獲取對方的鎖。線程1等待B鎖,線程2等待A鎖。

雙方無限等待下去,導致死鎖

死鎖發生后:

沒有任何機制能解除死鎖

只能強制結束JVM進程

所以,我們在編寫多線程程序時,必須要避免出現死鎖。 如何避免死鎖:線程獲取鎖的順序要一致

4.示例

4.1 死鎖

class ShareObject{

final Object lockA = new Object();

final Object lockB = new Object();

int accountA = 1000;

int accountB = 2000;

public void a2b(int balance){ //a2b: acountA減, accountB加

synchronized (lockA){

accountA -= balance;

synchronized (lockB){

accountB += balance;

}

}

}

public void b2a(int balance){ //b2a:acountA加, accountB減

synchronized (lockB){

accountB -= balance;

synchronized (lockA){

accountA += balance;

}

}

}

}

class AThread extends Thread{

public void run(){

for(int i=0;i

Main.shared.a2b(1);

if(i%100==0){

System.out.println(".");

}

}

}

}

class BThread extends Thread{

public void run(){

for(int i=0;i

Main.shared.b2a(1);

if(i%100==0){

System.out.println(".");

}

}

}

}

public class Main{

final static int LOOP = 1000;

public static ShareObject shared = new ShareObject();

public static void main(String[] args) throws Exception{

Thread t1 = new AThread();

Thread t2 = new BThread();

t1.start();

t2.start();

t1.join();

t2.join();

System.out.println("end");

}

}

### 4.2 避免死鎖 修改b2a() ```#java public void b2a(int balance){ synchronized (lockA){ accountA += balance; synchronized (lockB){ accountB -= balance; } } } } ```

4總結

死鎖產生的條件: * 多線程各自持有不同的鎖,并互相試圖獲取對方已持有的鎖

如何避免死鎖? * 多線程獲得鎖的順序要一致

總結

以上是生活随笔為你收集整理的java多线程同步与死锁,廖雪峰Java11多线程编程-2线程同步-3死锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。