真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解java并發(fā)中的原子性與可視性

如何理解java 并發(fā)中的原子性與可視性?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

成都創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)高州,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792

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類(lèi)型) 這個(gè)操作是不可分割的,那么我們說(shuō)這個(gè)操作時(shí)原子操作。再比如:a++; 這個(gè)操作實(shí)際是a = a + 1;是可分割的,所以他不是一個(gè)原子操作。非原子操作都會(huì)存在線程安全問(wèn)題,需要我們使用同步技術(shù)(sychronized)來(lái)讓它變成一個(gè)原子操作。一個(gè)操作是原子操作,那么我們稱(chēng)它具有原子性。Java的concurrent包下提供了一些原子類(lèi),我們可以通過(guò)閱讀API來(lái)了解這些原子類(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;//同理 
 } 
 
}

關(guān)于如何理解java 并發(fā)中的原子性與可視性問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


網(wǎng)頁(yè)題目:如何理解java并發(fā)中的原子性與可視性
URL分享:http://weahome.cn/article/pdehdp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部