Java多線程synchronized同步方法詳解

1、synchronized 方法與鎖對象

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的即墨網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

線程鎖的是對象。

1)A線程先持有 object 對象的 Lock 鎖, B線程可以以異步的方式調(diào)用 object 對象中的非 synchronized 類型的方法

2)A線程先持有 object 對象的 Lock 鎖, B線程如果在這時(shí)調(diào)用 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();
      }
    }

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

結(jié)果如圖:

Java多線程synchronized同步方法詳解

3、synchronized 鎖重入

"可重入鎖"的概念是:

自己可以再次活得自己的內(nèi)部鎖。比如有1條線程獲得了某個對象的鎖,此時(shí)這個對象鎖還沒有釋放,當(dāng)其再次想要獲取這個對象的鎖的時(shí)候還是可以獲取的,如果不可以鎖重入的話,就會造成死鎖。

可重入鎖也支持在父子類繼承的環(huán)境中:在繼承中,子類是完全可以通過“可重入鎖”調(diào)用父類的同步方法的。

4、出現(xiàn)異常,鎖自動釋放

線程出現(xiàn)異常,會釋放當(dāng)前線程的鎖

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

分享文章:Java多線程synchronized同步方法詳解
URL分享:http://bm7419.com/article2/gijpoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站導(dǎo)航微信公眾號、ChatGPT企業(yè)網(wǎng)站制作、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)