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

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

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

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

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

原子性

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

可見性

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

他們之間關(guān)系

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

實(shí)例

package com.chu.test.thread; 
/** 
 * 可見性分析 
 * @author Administrator 
 * 
 *volatile 會(huì)拒絕編譯器對(duì)其修飾的變量進(jìn)行優(yōu)化。也就不會(huì)存在重排序的問題。volatile只會(huì)影響可見性,不會(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é)果不一定具有可見性。加上volatile后就具備了可見性。 
  t.ready = true;//同理 
 } 
 
} 

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

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

相關(guān)文章

  • 基于ReentrantLock的實(shí)現(xiàn)原理講解

    基于ReentrantLock的實(shí)現(xiàn)原理講解

    這篇文章主要介紹了ReentrantLock的實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringMVC使用MultipartResolver實(shí)現(xiàn)文件上傳

    SpringMVC使用MultipartResolver實(shí)現(xiàn)文件上傳

    MultipartResolver 用于處理文件上傳,當(dāng)收到請(qǐng)求時(shí) DispatcherServlet 的 checkMultipart() 方法會(huì)調(diào)用 MultipartResolver 的 isMultipart() 方法判斷請(qǐng)求中是否包含文件
    2023-02-02
  • java冷知識(shí):javac AbstractProcessor詳解

    java冷知識(shí):javac AbstractProcessor詳解

    這篇文章主要介紹了java冷知識(shí):javac AbstractProcessor詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 關(guān)于idea剛打開時(shí)瘋狂報(bào)錯(cuò)的問題

    關(guān)于idea剛打開時(shí)瘋狂報(bào)錯(cuò)的問題

    這篇文章主要介紹了關(guān)于idea剛打開時(shí)瘋狂報(bào)錯(cuò)的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • SpringBoot項(xiàng)目請(qǐng)求不中斷動(dòng)態(tài)更新代碼的實(shí)現(xiàn)

    SpringBoot項(xiàng)目請(qǐng)求不中斷動(dòng)態(tài)更新代碼的實(shí)現(xiàn)

    在開發(fā)中,有時(shí)候不停機(jī)動(dòng)態(tài)更新代碼熱部署是一項(xiàng)至關(guān)重要的功能,它可以在請(qǐng)求不中斷的情況下下更新代碼,這種方式不僅提高了開發(fā)效率,還能加速測(cè)試和調(diào)試過程,本文將詳細(xì)介紹如何在 Spring Boot 項(xiàng)目在Linux系統(tǒng)中實(shí)現(xiàn)熱部署,特別關(guān)注優(yōu)雅關(guān)閉功能的實(shí)現(xiàn)
    2024-09-09
  • 利用Mybatis向PostgreSQL中插入并查詢JSON字段

    利用Mybatis向PostgreSQL中插入并查詢JSON字段

    這篇文章主要介紹了利用Mybatis向PostgreSQL中插入并查詢JSON字段,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Spring IOC裝配Bean過程解析

    Spring IOC裝配Bean過程解析

    這篇文章主要介紹了Spring IOC裝配Bean過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 通過實(shí)例了解java序列化機(jī)制

    通過實(shí)例了解java序列化機(jī)制

    這篇文章主要介紹了通過實(shí)例了解java序列化機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring 5.0集成log4j2日志管理的示例代碼

    Spring 5.0集成log4j2日志管理的示例代碼

    本篇文章主要介紹了Spring 5.0集成log4j2日志管理的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • java 讀取文件方法的總結(jié)

    java 讀取文件方法的總結(jié)

    這篇文章主要介紹了java 讀取文件方法的總結(jié)的相關(guān)資料,這里提供文件讀取5種方法并附實(shí)例,需要的朋友可以參考下
    2017-08-08

最新評(píng)論