volatile語義理解
java記憶體模型中的volatile關鍵字保證:
- 保證多執行緒共享變數的可見性,但是不能保證原子性
- synchronized 關鍵字保證了操作的原子性,可見性,但是不能保證指令重拍
- 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