1. 程式人生 > 其它 >Java多執行緒-01[鎖物件改變導致非同步執行]

Java多執行緒-01[鎖物件改變導致非同步執行]

先來看這樣一段程式碼

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",所以獲取到了,兩個執行緒非同步執行