1. 程式人生 > 程式設計 >Java多執行緒synchronized同步方法詳解

Java多執行緒synchronized同步方法詳解

1、synchronized 方法與鎖物件

  執行緒鎖的是物件。

  1)A執行緒先持有 object 物件的 Lock 鎖, B執行緒可以以非同步的方式呼叫 object 物件中的非 synchronized 型別的方法

  2)A執行緒先持有 object 物件的 Lock 鎖, B執行緒如果在這時呼叫 object 物件中的 synchronized 型別的方法,則需要等待,也就是同步。

2、髒讀(DirtyRead)

  示例:

public class DirtyReadTest {
  public static void main(String[] args) {
    try {
      PublicVar publicVar = new PublicVar();
      ThreadA thread = new ThreadA(publicVar);
      thread.start();
      Thread.sleep(200);
      publicVar.getValue();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  static class ThreadA extends Thread {
    private PublicVar publicVar;

    public ThreadA(PublicVar publicVar) {
      this.publicVar = publicVar;
    }

    @Override
    public void run() {
      super.run();
      publicVar.setValue("B","BB");
    }
  }

  static class PublicVar {
    public String username = "A";
    public String password = "AA";

    synchronized public void setValue(String username,String password) {
      try {
        this.username = username;
        Thread.sleep(1000);
        this.password = password;
        System.out.println("setValue method thread name = " + Thread.currentThread().getName() + "\tusername = " + username + "\tpassword = " + password);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

    // 因為 getValue 方法是非 synchronized 方法,所以造成了髒讀
    public void getValue() {
      System.out.println("getValue method thread name = " + Thread.currentThread().getName() + "\tusername = " + username + "\tpassword = " + password);
    }
  }
}

結果如圖:

Java多執行緒synchronized同步方法詳解

3、synchronized 鎖重入

  "可重入鎖"的概念是:

  自己可以再次活得自己的內部鎖。比如有1條執行緒獲得了某個物件的鎖,此時這個物件鎖還沒有釋放,當其再次想要獲取這個物件的鎖的時候還是可以獲取的,如果不可以鎖重入的話,就會造成死鎖。

  可重入鎖也支援在父子類繼承的環境中:在繼承中,子類是完全可以通過“可重入鎖”呼叫父類的同步方法的。

4、出現異常,鎖自動釋放

  執行緒出現異常,會釋放當前執行緒的鎖

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。