Java多線程產生死鎖的一個簡單案例


synchronized是Java中的關鍵字,是一種同步鎖。它修飾的對象有以下幾種:

1. 修飾一個代碼塊,被修飾的代碼塊稱為同步語句塊,其作用的范圍是大括號{}括起來的代碼,作用的對象是調用這個代碼塊的對象;
2. 修飾一個方法,被修飾的方法稱為同步方法,其作用的范圍是整個方法,作用的對象是調用這個方法的對象;
3. 修改一個靜態方法,其作用的范圍是整個靜態方法,作用的對象是這個類的所有對象;
4. 修改一個,其作用的范圍是synchronized后面括號括起來的部分,作用主的對象是這個類的所有對象。

首先,我們在java中創建兩個字符串,strA 、strB。讓每個線程都用synchronized鎖住字符串(線程A先鎖strA ,再去鎖strB;線程B先鎖strA,再鎖strB),如果線程A鎖住strA ,線程B鎖住strB,線程A就沒辦法鎖住strB,線程B也沒辦法鎖住strA,這個時候就陷入了死鎖。

 

 1 package com.abcd;
 2 
 3 public class Test {
 4     public static String objA = "strA";
 5     public static String objB = "strB";
 6     public static void main(String[] args){
 7         Thread a = new Thread(new Lock1());
 8         Thread b = new Thread(new Lock2());
 9         a.start();
10         b.start();
11     }    
12 }
13 class Lock1 implements Runnable{
14     @Override
15     public void run(){
16         try{
17             System.out.println("Lock1 running");
18             while(true){
19                 synchronized(Test.objA){
20                     System.out.println("Lock1 lock strA");
21                     Thread.sleep(3000);//獲取strA后先等一會兒,讓Lock2有足夠的時間鎖住strB
22                     synchronized(Test.objB){
23                         System.out.println("Lock1 lock strB");
24                     }
25                 }
26             }
27         }catch(Exception e){
28             e.printStackTrace();
29         }
30     }
31 }
32 class Lock2 implements Runnable{
33     @Override
34     public void run(){
35         try{
36             System.out.println("Lock2 running");
37             while(true){
38                 synchronized(Test.objB){
39                     System.out.println("Lock2 lock strB");
40                     Thread.sleep(3000);
41                     synchronized(Test.objA){
42                         System.out.println("Lock2 lock strA");
43                     }
44                 }
45             }
46         }catch(Exception e){
47             e.printStackTrace();
48         }
49     }
50 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM