大家在學習java多線程的時候肯定會遇到這個問題,而且在面試的時候也可能會談到java多線程這一塊的知識。今天我們就來看看這個東西~~~ synchronized 這個是對類實例進行加鎖,可以簡稱為“實例鎖”或者是“對象鎖”。當某個線程調用synchronized方法的時候,就會給它加上了一個鎖,其 ...
大家在學習java多線程的時候肯定會遇到這個問題,而且在面試的時候也可能會談到java多線程這一塊的知識。今天我們就來看看這個東西~~~
synchronized 這個是對類實例進行加鎖,可以簡稱為“實例鎖”或者是“對象鎖”。當某個線程調用synchronized方法的時候,就會給它加上了一個鎖,其他線程就會無法訪問,等到這個鎖被釋放,別的線程拿到這個鎖的時候,才可以訪問該方法。
static synchronized這個是“全局鎖”或者是“類鎖”,該鎖針對的是類,不管實例了多少個對象,線程都共用該鎖。
下麵我們來看代碼:
1 import java.util.concurrent.TimeUnit; 2 3 public class Test { 4 public static void main(String[] args) { 5 Phone phone1 = new Phone(); 6 Phone phone2 = new Phone(); 7 8 //這裡使用的是lambda表達式 9 new Thread(() -> {phone1.listening(); }, "A線程").start(); 10 11 try { 12 TimeUnit.SECONDS.sleep(1); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 17 new Thread(() -> {phone2.reading(); }, "B線程").start(); 18 } 19 } 20 21 class Phone{ 22 23 public static synchronized void listening() { 24 try { 25 TimeUnit.SECONDS.sleep(3); 26 } catch (InterruptedException e) { 27 e.printStackTrace(); 28 } 29 System.out.println("該手機正在播放音樂~"); 30 } 31 32 public static synchronized void reading() { 33 System.out.println("該手機正在顯示電子書~"); 34 } 35 }
運行結果是:
但是當我把reading方法上的static 這個關鍵字去掉後,代碼是這樣的 :
1 import java.util.concurrent.TimeUnit; 2 3 public class Test { 4 public static void main(String[] args) { 5 Phone phone1 = new Phone(); 6 Phone phone2 = new Phone(); 7 8 //這裡使用的是lambda表達式 9 new Thread(() -> {phone1.listening(); }, "A線程").start(); 10 11 try { 12 TimeUnit.SECONDS.sleep(1); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 17 new Thread(() -> {phone2.reading(); }, "B線程").start(); 18 } 19 } 20 21 class Phone{ 22 23 public static synchronized void listening() { 24 try { 25 TimeUnit.SECONDS.sleep(3); 26 } catch (InterruptedException e) { 27 e.printStackTrace(); 28 } 29 System.out.println("該手機正在播放音樂~"); 30 } 31 32 public synchronized void reading() { 33 System.out.println("該手機正在顯示電子書~"); 34 } 35 }
運行結果是:
好了,大家在仔細品品~~~