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 }