欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

同步鎖鎖的是同一個對象,如果對象發(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();
      }
    }
  }
}

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

鎖失敗的原因:

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,這樣的話,每 ++一次,那么就會產(chǎn)生一個新的對象,而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();
      }
    }
  }
}

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

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

相關(guān)文章

  • Java中反射的"暴破"機制(SetAccessible方法)詳解

    Java中反射的"暴破"機制(SetAccessible方法)詳解

    這篇文章主要為大家詳細介紹了Java中反射的"暴破"機制,以及如何利用這一機制實現(xiàn)訪問非公有屬性,方法,和構(gòu)造器,文中示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08
  • 關(guān)于maven項目引入maven庫沒有的jar處理辦法

    關(guān)于maven項目引入maven庫沒有的jar處理辦法

    這篇文章主要介紹了關(guān)于maven項目引入maven庫沒有的jar處理辦法,在平時開發(fā)中,有些jar包是不存在maven中央庫中的,那么此時該如何解決才能方便后續(xù)處理呢,需要的朋友可以參考下本文
    2023-03-03
  • RabbitMQ 避免消息重復消費的方法

    RabbitMQ 避免消息重復消費的方法

    消費者端實現(xiàn)冪等性,意味著消息永遠不會消費多次,即使收到了多條一樣的消息,這篇文章給大家分享RabbitMQ 避免消息重復消費的方法,感興趣的朋友一起看看吧
    2024-03-03
  • SpringBoot集成ShardingSphere實現(xiàn)數(shù)據(jù)庫分表

    SpringBoot集成ShardingSphere實現(xiàn)數(shù)據(jù)庫分表

    ShardingSphere?是一個開源的分布式數(shù)據(jù)庫中間件,旨在為應用提供數(shù)據(jù)庫分片、讀寫分離、分布式事務等功能,下面我們來看看SpringBoot如何集成ShardingSphere實現(xiàn)數(shù)據(jù)庫分表吧
    2024-12-12
  • Java中的Enum枚舉使用方法解析

    Java中的Enum枚舉使用方法解析

    這篇文章主要介紹了Java中的Enum枚舉使用方法解析,枚舉是一種數(shù)據(jù)類型,和int、double、string等類型相似,枚舉用于聲明一組命名的常數(shù),當一個變量有幾種可能的取值時,可以將它定義為枚舉類型,需要的朋友可以參考下
    2023-11-11
  • IDEA 控制臺中文亂碼4種解決方案

    IDEA 控制臺中文亂碼4種解決方案

    IntelliJ IDEA 如果不進行相關(guān)設置,可能會導致控制臺中文亂碼、配置文件中文亂碼等問題,本文主要介紹了IDEA控制臺中文亂碼4種解決方案,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Java8加java10等于Java18的版本查看及特性詳解

    Java8加java10等于Java18的版本查看及特性詳解

    這篇文章主要為大家介紹了Java?8加java10等于Java18的各個版本要點詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • springboot+jwt+springSecurity微信小程序授權(quán)登錄問題

    springboot+jwt+springSecurity微信小程序授權(quán)登錄問題

    這篇文章主要介紹了springboot+jwt+springSecurity微信小程序授權(quán)登錄問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java常用集合之Set和Map的用法詳解

    Java常用集合之Set和Map的用法詳解

    這篇文章將通過一些示例為大家詳細介紹一下Java常用集合中Set和Map的用法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-07-07
  • 在Mac下IDEA安裝并使用protobuf方式(Java)

    在Mac下IDEA安裝并使用protobuf方式(Java)

    這篇文章主要介紹了在Mac下IDEA安裝并使用protobuf方式(Java),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論