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

Java線程并發(fā)訪問代碼分析

 更新時間:2019年11月22日 10:33:28   作者:最喜歡夏天了  
這篇文章主要介紹了Java線程并發(fā)訪問代碼分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Java線程并發(fā)訪問代碼分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

class ConcurrentThread {
  /**
   * 分析線程并發(fā)訪問代碼解釋原因
   * volatile關(guān)鍵字:
   * 1):保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的
   * 2):禁止進行指令重排序
   * volatile本質(zhì)是告訴JVM當前變量在寄存器(工作內(nèi)存)中的值是不確定的,需要從主存中讀取
   */

  private volatile int count = 0;

  public void inc() {
    try {
      Thread.sleep(3);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    count++;
  }

  @Override
  public String toString() {
    return "[count=" + count + "]";
  }
}
//----------------------------------------

public class VolatileTest {
  public static void main(String[] args) {
    final ConcurrentThread counter = new ConcurrentThread();
    for (int i = 0; i < 1000; i++) {
      new Thread(new Runnable() {
        @Override
        public void run() {
          counter.inc();
        }
      }).start();
    }
    System.out.println(counter);
  }
}

原因解釋:在Java的內(nèi)存模型中每一個線程運行時都有一個線程棧,線程棧保存了線程運行時候變量值信息

當線程訪問某一個對象值得時候:

1、通過對象的引用找到對應(yīng)在堆內(nèi)存的變量的值

2、把堆內(nèi)存變量的具體值load到線程本地內(nèi)存中,建立了一個變量副本,之后線程就不再和對象在堆內(nèi)存變量值有任何關(guān)系,而是直接修改副本變量的值,在修改完之后的某一個時刻(線程退出之前),自動把線程變量副本的值回寫到對象在堆中變量。這樣堆中的對象的值就產(chǎn)生變化了。

結(jié)合上例,也就是說上面主函數(shù)中開啟了1000個子線程,每個線程都有一個變量副本,每個線程修改變量只是臨時修改了自己的副本,當線程結(jié)束時再將修改的值寫入在主內(nèi)存中,這樣就出現(xiàn)了線程安全問題(拿到了主內(nèi)存中過時的變量值),因此結(jié)果就不可能等于1000了,一般都會小于1000.

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

相關(guān)文章

  • java?jar包后臺運行的兩種方式詳解

    java?jar包后臺運行的兩種方式詳解

    后臺運行jar的方法有多種方法可以實現(xiàn)Java后臺運行jar文件,下面介紹其中兩種常見的方法,下面這篇文章主要給大家介紹了關(guān)于java?jar包后臺運行的兩種方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • 基于SpringBoot實現(xiàn)圖片上傳及圖片回顯

    基于SpringBoot實現(xiàn)圖片上傳及圖片回顯

    本篇文章主要介紹了SpringBoot如何實現(xiàn)圖片上傳及圖片回顯,文中通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-08-08
  • java實現(xiàn)jframe透明窗體示例

    java實現(xiàn)jframe透明窗體示例

    這篇文章主要介紹了java實現(xiàn)jframe透明窗體示例,需要的朋友可以參考下
    2014-03-03
  • SpringSecurity 自定義表單登錄的實現(xiàn)

    SpringSecurity 自定義表單登錄的實現(xiàn)

    這篇文章主要介紹了SpringSecurity 自定義表單登錄的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Gradle的SpringBoot項目構(gòu)建圖解

    Gradle的SpringBoot項目構(gòu)建圖解

    這篇文章主要介紹了Gradle的SpringBoot項目構(gòu)建圖解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java NIO框架Netty簡單使用的示例

    Java NIO框架Netty簡單使用的示例

    本篇文章主要介紹了Java NIO框架Netty簡單使用的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • java中多態(tài)概念、實現(xiàn)原理詳解

    java中多態(tài)概念、實現(xiàn)原理詳解

    JAVA中多態(tài)性是對象多種表現(xiàn)形式的體現(xiàn)。在面向?qū)ο笾?最常見的多態(tài)發(fā)生在使用父類的引用來引用子類的對象。下面這篇文章主要給大家介紹一下,需要的朋友可以參考下
    2017-04-04
  • 詳解如何將已有項目改造為Spring Boot項目

    詳解如何將已有項目改造為Spring Boot項目

    本篇文章主要介紹了如何將已有項目改造為Spring Boot項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • SpringBoot接收各種各樣參數(shù)的示例詳解

    SpringBoot接收各種各樣參數(shù)的示例詳解

    參數(shù)映射準確來說是springmvc來幫我們干的活,但是由于springboot太過火爆,簡化了springmvc相關(guān)配置文件,以至于很多人會誤認為是springboot的功能,本文將給大家介紹SpringBoot接收各種各樣參數(shù),文中有詳細的代碼講解,需要的朋友可以參考下
    2024-04-04
  • java枚舉使用詳細介紹及實現(xiàn)

    java枚舉使用詳細介紹及實現(xiàn)

    這篇文章主要介紹了java枚舉使用詳細介紹及實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論