亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java Synchronized鎖失敗案例及解決方案

 更新時間:2020年04月30日 15:34:11   作者:踏步  
這篇文章主要介紹了Java Synchronized鎖失敗案例及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

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

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

鎖失敗的代碼:

public class IntegerSynTest {

  //線程實現(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();
      }
    }
  }
}

鎖失敗的運行結果:

鎖失敗的原因:

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

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

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

解決方法:

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

鎖成功的代碼

public class IntegerSynTest {

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

    private Integer num;
    /**
     * ---重點看這里---
     * 聲明要鎖的對象
     * ---重點看這里---
     */
    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();
      }
    }
  }
}

鎖成功的運行結果:

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

相關文章

  • Java數(shù)據(jù)結構貪心算法的實現(xiàn)

    Java數(shù)據(jù)結構貪心算法的實現(xiàn)

    本文主要介紹了Java數(shù)據(jù)結構貪心算法的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2007-03-03
  • 繼承WebMvcConfigurationSupport后自動配置不生效及如何配置攔截器

    繼承WebMvcConfigurationSupport后自動配置不生效及如何配置攔截器

    這篇文章主要介紹了繼承WebMvcConfigurationSupport后自動配置不生效及如何配置攔截器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Java版微信公眾號支付開發(fā)全過程

    Java版微信公眾號支付開發(fā)全過程

    這篇文章主要介紹了Java版微信公眾號支付開發(fā)全過程,本文通過實例相結合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • 詳解java中命令行模式的實現(xiàn)

    詳解java中命令行模式的實現(xiàn)

    命令模式是一種行為設計模式,它允許您將請求封裝為對象,以便您可以將其參數(shù)化、隊列化、記錄和撤銷,本文主要為大家介紹一下java實現(xiàn)命令模式的示例代碼,需要的可以參考下
    2023-09-09
  • java求解集合的子集的實例

    java求解集合的子集的實例

    這篇文章主要介紹了 java求解集合的子集的實例的相關資料,希望通過本文能幫助到大家,讓大家掌握這樣的方法,需要的朋友可以參考下
    2017-10-10
  • 詳解JAVA之運算符

    詳解JAVA之運算符

    這篇文章主要介紹了詳解Java中運算符以及相關的用法講解,一起跟著小編學習下吧,希望能夠給你帶來幫助
    2021-11-11
  • Mysql中的聚簇索引cluster index解析

    Mysql中的聚簇索引cluster index解析

    這篇文章主要介紹了Mysql中的聚簇索引cluster index解析,聚簇索引是一種數(shù)據(jù)庫索引的類型,它將數(shù)據(jù)行物理上存儲在磁盤上按照索引的順序進行排序,聚簇索引可以提高查詢性能,因為它可以減少磁盤I/O操作,需要的朋友可以參考下
    2023-10-10
  • springmvc 防止表單重復提交的兩種方法

    springmvc 防止表單重復提交的兩種方法

    最近在本地開發(fā)測試的時候,遇到一個表單重復提交的現(xiàn)象。本文主要介紹了springmvc 防止表單重復提交的兩種方法,感興趣的可以了解一下
    2021-08-08
  • Spring中Controller應用深入理解

    Spring中Controller應用深入理解

    這篇文章主要介紹了Spring項目中的Controller,Spring Controller本身也是一個Spring Bean,只是它多提供了Web能力,只需要造類上提供@Controller注解即可
    2022-12-12
  • java生成驗證碼工具類

    java生成驗證碼工具類

    這篇文章主要為大家詳細介紹了java生成驗證碼工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論