Java多執行緒-01[鎖物件改變導致非同步執行]
阿新 • • 發佈:2022-05-21
先來看這樣一段程式碼
MyThread.java
public class MyThread extends Thread { @Override public void run() { A.staticMethod(); } public static void main(String[] args) { MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); myThread1.start(); myThread2.start(); } }
A.java
package com.dronff.mt; /** * @author tyf * 2022/5/20 */ public class A { private static String a = "123"; public static void staticMethod(){ synchronized (a) { a="444"; System.out.println(Thread.currentThread().getName() + "執行緒呼叫了該方法1"); System.out.println(Thread.currentThread().getName()+ "執行緒呼叫了該方法2"); System.out.println(Thread.currentThread().getName() + "執行緒呼叫了該方3"); } } }
執行結果:
由結果可知:兩個執行緒執行靜態方法是非同步執行的
首先要明確:鎖是物件而不是變數名
假如Thread-0先在執行a="444"之前,時間片劃歸Thread-1,然後Thread-1嘗試獲取a指向的"123",但發現a已經上鎖了,,所以不執行,時間片再次劃給Thread-0,然後0繼續執行,執行完a="444"後,Thread-1需要獲取的不是"123"而是"444",所以獲取到了,兩個執行緒非同步執行