真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

解決JavaSynchronized鎖失敗問題

小編這次要給大家分享的是解決Java Synchronized鎖失敗問題,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營理念,通過多達(dá)10年累計超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:成都房屋鑒定等企業(yè),備受客戶好評。

synchronized關(guān)鍵字,一般稱之為”同步鎖“,用它來修飾需要同步的方法和需要同步代碼塊,默認(rèn)是當(dāng)前對象作為鎖的對象。

同步鎖鎖的是同一個對象,如果對象發(fā)生改變,則鎖會不生效。

鎖失敗的代碼:

public class IntegerSynTest {

  //線程實(shí)現(xiàn)Runnable接口
  private static class Worker implements Runnable{

    private Integer num;

    public Worker(Integer num){
      this.num=num;
    }
    @Override
    public void run() {
      
      synchronized (num){
        Thread thread = Thread.currentThread();
        //System.identityHashCode:返回原生的hashCode值,不管Object對象是被重寫;空引用的哈希代碼為零
        System.out.println(thread.getName()+"--@:---"+System.identityHashCode(num));
        num++;
        System.out.println(thread.getName()+"------num:"+num+"---"+System.identityHashCode(num));
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(thread.getName()+"------num:"+num+"---"+System.identityHashCode(num));
      }
    }

    public static void main(String[] args) {
      Worker worker = new Worker(1);
      for (int i = 0; i < 5; i++) {
        new Thread(worker).start();
      }
    }
  }
}

鎖失敗的運(yùn)行結(jié)果:

解決Java Synchronized鎖失敗問題

鎖失敗的原因:

1.num++  的  .class  實(shí)現(xiàn)是這樣的  Integer integer1 = this.num, integer2 = this.num = Integer.valueOf(this.num.intValue() + 1);

2.查看 Integer.valueOf()的源代碼

解決Java Synchronized鎖失敗問題

這時發(fā)現(xiàn),它是重新 new出一個新的Integer,這樣的話,每 ++一次,那么就會產(chǎn)生一個新的對象,而Synchronize鎖是鎖同一個對象,當(dāng)鎖不同對象時,則會鎖失敗。

解決方法:

Synchronized同步鎖只要鎖的對象不發(fā)生改變即可,那么由此只需要聲明一個對象,不修改它,鎖這一個對象即可(還有其他方法暫不一一列舉,以后也不會列舉了)。

鎖成功的代碼

public class IntegerSynTest {

  //線程實(shí)現(xiàn)Runnable接口
  private static class Worker implements Runnable{

    private Integer num;
    /**
     * ---重點(diǎn)看這里---
     * 聲明要鎖的對象
     * ---重點(diǎn)看這里---
     */
    private Object object = new Object();

    public Worker(Integer num){
      this.num=num;
    }
    @Override
    public void run() {
      //修改鎖對象
      synchronized (num){
        Thread thread = Thread.currentThread();
        //System.identityHashCode:返回原生的hashCode值,不管Object對象是被重寫;空引用的哈希代碼為零
        System.out.println(thread.getName()+"--@:---"+System.identityHashCode(num));
        num++;
        System.out.println(thread.getName()+"------num:"+num+"---"+System.identityHashCode(num));
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(thread.getName()+"------num:"+num+"---"+System.identityHashCode(num));
      }
    }

    public static void main(String[] args) {
      Worker worker = new Worker(1);
      for (int i = 0; i < 5; i++) {
        new Thread(worker).start();
      }
    }
  }
}

鎖成功的運(yùn)行結(jié)果:

解決Java Synchronized鎖失敗問題

看完這篇關(guān)于解決Java Synchronized鎖失敗問題的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。


文章標(biāo)題:解決JavaSynchronized鎖失敗問題
URL網(wǎng)址:http://weahome.cn/article/pjdecd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部