1. 程式人生 > >volatile語義理解

volatile語義理解

java記憶體模型中的volatile關鍵字保證:

  1. 保證多執行緒共享變數的可見性,但是不能保證原子性
  2. synchronized 關鍵字保證了操作的原子性,可見性,但是不能保證指令重拍
  3. volatile關鍵字保證了指令的重排序,java記憶體模型要求對volatile變數的寫操作先與volatile變數的讀操作

看程式碼

package com.bootdo.testDemo.rpc;


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

class MyList{

    private  volatile List<Integer> list=new ArrayList<>();

    public void add(int data){
        list.add(data);
    }

    public int getSize(){
        return list.size();
    }
}
class ThreadB extends Thread{

    private MyList myList;

    public ThreadB(MyList myList){
        super();
        this.myList=myList;
    }

    @Override
    public void run() {
        try{
            while(true){
                if(myList.getSize()==2){
                    System.out.println("threadB interrupt");
                    throw new InterruptedException();
                }

                //System.out.println("threadB size="+myList.getSize());
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }

    }
}
class ThreadA extends Thread{
    private MyList myList;

    public ThreadA(MyList myList){
        super();
        this.myList=myList;
    }
    @Override
    public void run() {

        for(int i=0;i<3;i++){
            myList.add(3);
            System.out.println("threadA add :size="+myList.getSize());

            try {
                //注意這裡休眠是為了保證讓出cpu執行時間,保證執行緒ThreadB執行,讓兩個執行緒交替執行
                Thread.sleep(1000);   
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}
public class ThreadDemo {
    static volatile MyList myList=new MyList();

    public static void  show(){
        Thread threada=new ThreadA(myList);
        Thread threadb=new ThreadB(myList);
        threada.setName("threada");
        threadb.setName("threadb");
        threada.start();
        threadb.start();
    }

    public static void main(String[] args) {
        ThreadDemo2 threadDemo2=new ThreadDemo2();
        new Thread(threadDemo2,"threadDemo2").start();

        while(true){

            System.out.println(" hahaha......");     //1  可以導致執行緒中斷

            /**
             * public void println(String x) {
             * synchronized (this) {
                    print(x);
                    newLine();
                }
                }
             */

            synchronized (ThreadDemo.class){}       //2 可以導致執行緒中斷

            ThreadDemo.test2();                    //3可以導致執行緒中斷   synchronized 保持執行緒的可見性
            ThreadDemo.test1();                    //4 main 執行緒陷入死迴圈

            if(threadDemo2.flag){
                System.out.println("main thread exit :");
                break;
            }
        }
    }

    public static void test1(){}

    public static  synchronized void test2(){}


    static class  ThreadDemo2 extends Thread{

        private  boolean flag=false;

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            flag=true;

            System.out.println(Thread.currentThread().getName()+" 執行緒結束:flag="+flag);
        }
    }
}

相關推薦

volatile語義理解

java記憶體模型中的volatile關鍵字保證: 保證多執行緒共享變數的可見性,但是不能保證原子性 synchronized 關鍵字保證了操作的原子性,可見性,但是不能保證指令重拍 volatile關鍵字保證了指令的重排序,java記憶體模型要求對volatile變數

深入理解Java記憶體模型的volatile語義

程曉明,Java軟體工程師,國家認證的系統分析師、資訊專案管理師。專注於併發程式設計。個人郵箱:[email protected]。 volatile的特性 當我們宣告共享變數為volatile後,對這個變數的讀/寫將會很特別。理解volatile特性的一個好

輕量級的同步機制——volatile語義詳解(可見性保證+禁止指令重排)

sta 指令重排 指向 runnable single 能夠 工作 star image 1.關於volatile volatile是java語言中的關鍵字,用來修飾會被多線程訪問的共享變量,是JVM提供的輕量級的同步機制,相比同步代碼塊或者重入鎖有更好的性能。它主要有兩重

內存屏障和 volatile 語義

只需要 date 開發 多核 bool 計算 java 例子 說明 背景 在閱讀java中volatile的關鍵詞語義時,發現很多書中都使用了重排序這個詞來描述,同時又講到了線程工作內存和主存等等相關知識。但是只用那些書的抽象定義進行理解時總是感覺什麽地方說不通,最後發現,

volatile簡單理解

通過java記憶體模型理解 程式碼例子理解: 作者:KE meng 連結:https://www.zhihu.com/question/31459750/answer/52061391 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

記憶體屏障和 volatile 語義

背景 在閱讀java中volatile的關鍵詞語義時,發現很多書中都使用了重排序這個詞來描述,同時又講到了執行緒工作記憶體和主存等等相關知識。但是隻用那些書的抽象定義進行理解時總是感覺什麼地方說不通,最後發現,是那些書中使用的抽象遮蔽了一些對讀者的知識點,反而導致了理解上的

對嵌入式C語言中volatile理解

一.前言 1.編譯器優化介紹: 由於記憶體訪問速度遠不及CPU處理速度,為提高機器整體效能,在硬體上引入硬體快取記憶體Cache,加速對記憶體的訪問。另外在現代CPU中指令的執行並不一定嚴格按照順序執行,沒有相關性的指令可以亂序執行,以充分利用CPU的指令流水線,提高執行速

2017年語義理解總結(一)

2017年就這麼悄無聲息地過去了。在工業界,2016年是推薦的元年,2017年是中國的AI元年,這意味著路漫漫其修遠兮~,而學術界往往會超前於工業界,有些時候難免會一廂情願。過去的一年在nlp領域裡,知識圖譜的發展是最為耀眼的,最為尷尬的仍然是chatbot的多輪對話。知識圖譜底層更高於RDF層次的語言被提出

語音識別,語義理解一站式解決(android平臺&olami sdk)

olami sdk實現了把錄音或者文字轉化為使用者可以理解的json字串從而實現語義理解,使用者可以定義自己的語義,是不是很強大?本文講述怎麼自定義語義,以及如何解析自定義語義。 本文使用olami sdk做了一個線上聽書的demo,使用者只需類似“我想

nlp語義理解的一點兒看法

nlp領域裡,語義理解仍然是難題!   給你一篇文章或者一個句子,人們在理解這些句子時,頭腦中會進行上下文的搜尋和知識聯想。通常情況下,人在理解語義時頭腦中會搜尋與之相關的知識。知識圖譜的創始人人為,構成這個世界的是實體,而不是字串,這從根本上改變了過去搜索的

語音識別,語義理解一站式解決之智慧照相機(人臉識別,olami)

olami sdk實現了把錄音或者文字轉化為使用者可以理解的json字串從而實現語義理解,使用者可以定義自己的 語義,通過這種方式可以實現使用者需要的語義理解。前面寫了兩篇語音識別,語義理解的博文,分別是語音 線上聽書和語音記帳軟體,本篇是語音智慧照相機

2017年語義理解總結(二)

前面的部落格進行了總述,這篇部落格細化深入,主要結合知識圖譜,KB_QA,語義表示的豐富性方面來論述,但是仍然會很寬泛,因為在部落格裡將具體的技術細節,沒有太大意義,需要發論文。前面提到,語義理解,一方面要獲取豐富,靈活的語義表示,另一方面要與知識圖譜融合。要想獲取精準的語義理解,比如誰是第一個為紙牌屋裡的x

語音識別,語義理解一站式解決之二(android,olami)

前言 國內語音識別技術已有多家,而olami不僅在語音識別上準確率較高,更重要的是在語義理解上十分強大,本文用olami sdk做了一個記賬demo(記賬部分程式碼參考開原始碼),這個demo可以語音新增不同消費記錄,查詢當天,當月消費情況,刪除消費列

靈雲語義理解

效果圖 原始碼 SDK下載 SDK整合 下載SDK以後,將jar和so匯入工程 許可權 <uses-permission android:name="android.permission.INTERNET" /&

關於Java中的關鍵字volatile理解

參考:http://zhidao.baidu.com/link?url=SZIOANgZCGb1t1DcuIQ1SVCwDlbVuIb8w5p1FLpUWhfo34zCAYs7eyxMUNeMohRVpgkajMCpUZTQdlGz7XiUhq Volatile修飾的成員變

驚人!微信公眾平臺新增語義理解介面

微信公眾平臺新增語義理解介面 微信公眾平臺語義理解介面正式對外開放。通過語義介面,接收使用者傳送的自然語言請求,讓系統理解使用者的說話內容。 微信語義理解介面提供從使用者自然語言輸入到結構化解析的

ros+科大迅飛語音包+圖靈機器人(三)通過圖靈進行語義理解

在vioce_system 包中的src資料夾下建立一個tuling_nlu.cpp檔案以下是tuling_nlu.cpp的內容(注意,需要把程式碼中的key改為自己建立機器人的key,把 curl_easy_setopt(pCurl, CURLOPT_URL, "http://openapi.tuling1

如何妙筆勾檀妝:畫素級語義理解

編者按:在徐凝的《宮中曲》中有這樣一句詩,“一日新妝拋舊樣”,描繪了中唐時期宮中女人換妝的場景,

caffe 深度學習 語義分割 語義理解

手把手在自己的資料集cityscapes上訓練FCN 尼猜 在CV中掙扎的飛行員 ​關注她 12 人讚了該文章 1 你需要準備的 資料集(RGB + Label Mask) 在本文中以Cityscapes Fine Dataset為例 Caf

用Kotlin開發android平臺語音識別,語義理解應用(olamisdk)

本文使用Kotlin開發android平臺的一個語音識別方面的應用,用的是尤拉密開放平臺olamisdk。 1.Kotlin簡介 Kotlin是由JetBrains建立的基於JVM的程式語言,IntelliJ正是JetBrains的傑作,而android