最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 并發(fā)中的原子性與可視性實(shí)例詳解

 更新時(shí)間:2017年07月10日 15:26:48   投稿:lqh  
這篇文章主要介紹了java 并發(fā)中的原子性與可視性實(shí)例詳解的相關(guān)資料,原子性是說(shuō)一個(gè)操作是否可分割??梢?jiàn)性是說(shuō)操作結(jié)果其他線程是否可見(jiàn)。需要的朋友可以參考下

java 并發(fā)中的原子性與可視性實(shí)例詳解

并發(fā)其實(shí)是一種解耦合的策略,它幫助我們把做什么(目標(biāo))和什么時(shí)候做(時(shí)機(jī))分開(kāi)。這樣做可以明顯改進(jìn)應(yīng)用程序的吞吐量(獲得更多的CPU調(diào)度時(shí)間)和結(jié)構(gòu)(程序有多個(gè)部分在協(xié)同工作)。做過(guò)java Web開(kāi)發(fā)的人都知道,Java Web中的Servlet程序在Servlet容器的支持下采用單實(shí)例多線程的工作模式,Servlet容器為你處理了并發(fā)問(wèn)題。

原子性

原子是世界上的最小單位,具有不可分割性。比如 a=0;(a非long和double類型) 這個(gè)操作是不可分割的,那么我們說(shuō)這個(gè)操作時(shí)原子操作。再比如:a++; 這個(gè)操作實(shí)際是a = a + 1;是可分割的,所以他不是一個(gè)原子操作。非原子操作都會(huì)存在線程安全問(wèn)題,需要我們使用同步技術(shù)(sychronized)來(lái)讓它變成一個(gè)原子操作。一個(gè)操作是原子操作,那么我們稱它具有原子性。Java的concurrent包下提供了一些原子類,我們可以通過(guò)閱讀API來(lái)了解這些原子類的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。

可見(jiàn)性

可見(jiàn)性,是指線程之間的可見(jiàn)性,一個(gè)線程修改的狀態(tài)對(duì)另一個(gè)線程是可見(jiàn)的。也就是一個(gè)線程修改的結(jié)果。另一個(gè)線程馬上就能看到。比如:用volatile修飾的變量,就會(huì)具有可見(jiàn)性。volatile修飾的變量不允許線程內(nèi)部緩存和重排序,即直接修改內(nèi)存。所以對(duì)其他線程是可見(jiàn)的。但是這里需要注意一個(gè)問(wèn)題,volatile只能讓被他修飾內(nèi)容具有可見(jiàn)性,但不能保證它具有原子性。比如 volatile int a = 0;之后有一個(gè)操作 a++;這個(gè)變量a具有可見(jiàn)性,但是a++ 依然是一個(gè)非原子操作,也就這這個(gè)操作同樣存在線程安全問(wèn)題。

他們之間關(guān)系

原子性是說(shuō)一個(gè)操作是否可分割??梢?jiàn)性是說(shuō)操作結(jié)果其他線程是否可見(jiàn)。這么看來(lái)他們其實(shí)沒(méi)有什么關(guān)系。

實(shí)例

package com.chu.test.thread; 
/** 
 * 可見(jiàn)性分析 
 * @author Administrator 
 * 
 *volatile 會(huì)拒絕編譯器對(duì)其修飾的變量進(jìn)行優(yōu)化。也就不會(huì)存在重排序的問(wèn)題。volatile只會(huì)影響可見(jiàn)性,不會(huì)影響原子性。 
 *下面程序如果不加 
 */ 
public class Test { 
 
 volatile int a = 1; 
 volatile boolean ready; 
  
 public class PrintA extends Thread{ 
  @Override 
  public void run() { 
   while(!ready){ 
    Thread.yield(); 
   } 
   System.out.println(a); 
  } 
 } 
 public static void main(String[] args) throws InterruptedException { 
  Test t = new Test(); 
  t.new PrintA().start(); 
  //下面兩行如果不加volatile的話,執(zhí)行的先后順序是不可預(yù)測(cè)的。并且下面兩行都是原子操作,但是這兩行作為一個(gè)整體的話就不是一個(gè)原子操作。 
  t.a = 48; //這是一個(gè)原子操作,但是其結(jié)果不一定具有可見(jiàn)性。加上volatile后就具備了可見(jiàn)性。 
  t.ready = true;//同理 
 } 
 
} 

上面程序如果變量a不用volatile修飾那么輸出結(jié)果很可能就是0.。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論

临汾市| 保定市| 项城市| 通州区| 陈巴尔虎旗| 介休市| 武乡县| 五峰| 诸暨市| 大连市| 垣曲县| 旅游| 腾冲县| 潢川县| 乡宁县| 海口市| 萍乡市| 大田县| 中西区| 中牟县| 汉阴县| 高密市| 秦皇岛市| 叙永县| 宁化县| 察隅县| 杨浦区| 城市| 新密市| 曲松县| 鄂尔多斯市| 吐鲁番市| 信丰县| 大渡口区| 南京市| 松潘县| 高雄市| 监利县| 府谷县| 遵化市| 土默特右旗|