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

淺談Java多線程編程中Boolean常量的同步問題

 更新時間:2015年10月22日 18:19:45   作者:johnshen0708  
這篇文章主要介紹了淺談Java多線程編程中Boolean常量的同步問題,主要針對線程之間同步了不同的布爾對象的問題,需要的朋友可以參考下

在JAVA中通過synchronized語句可以實現(xiàn)多線程并發(fā)。使用同步代碼塊,JVM保證同一時間只有一個線程可以擁有某一對象的鎖。鎖機制實現(xiàn)了多個線程安全地對臨界資源進行訪問。
 
同步代碼寫法如下:
 
代碼1:

Object obj = new Object(); 
... 
synchronized(obj) { 
 //TODO: 訪問臨界資源 
} 

JAVA的多線程總是充滿陷阱,如果我們用Boolean作為被同步的對象,可能會出現(xiàn)以下兩種情況:
 
一. 以為對一個對象加鎖,實際同步的是不同對象。
 
代碼2:
 

private volatile Boolean isTrue = false; 
 
publich void aMethod() { 
 ... 
 synchronized(isTrue) { 
  isTrue = !isTrue; 
  //TODO: 訪問臨界資源 
  isTrue = !isTrue; 
 } 
 ... 
} 

 咋一看上面的代碼沒有問題,由于使用了synchronized(isTrue)同一時間只能有一個線程訪問臨界資源,但事實并不是這樣。因為false和true這兩個常量對應(yīng)著兩個不同的對象。當isTrue產(chǎn)生變化時,很可能導(dǎo)致不同的線程同步了不同的對象。JAVA的自動裝箱會將false變?yōu)锽oolean.FALSE,將true變?yōu)锽oolean.TRUE(同時這也說明了此處若將false改為Boolean.FALSE其結(jié)果也是一樣的)。寫一個以上情況的測試代碼如下:
 
代碼3:
 

public class BooleanTest { 
   
  private volatile Boolean isTrue = Boolean.FALSE; //此處用false也一樣 
   
  public void aMethod() { 
    for(int i=0;i<10;i++) { 
      Thread t = new Thread() { 
        public void run() { 
          synchronized(isTrue) { 
            isTrue = !isTrue; 
            System.out.println(Thread.currentThread().getName() + " - isTrue=" + isTrue); 
            try{ 
              Double ran = 1000 * Math.random(); 
              Thread.sleep(ran.intValue()); 
            }catch(InterruptedException e) {} 
             
            if(!isTrue) System.out.println(Thread.currentThread().getName() + " - Oh, No!"); 
 
            isTrue = !isTrue; 
          } 
        } 
      }; 
      t.start(); 
    } 
  } 
   
  public static void main(String... args) { 
    BooleanTest bt = new BooleanTest(); 
    bt.aMethod(); 
  } 
} 

 運行以上代碼,不時的會看到 " - Oh, No!",表示不同的線程同時進入到synchronized代碼塊中。
 
二. 以為同步的是不同對象,實際是一個對象。
 
有時候我們可能希望在多個對象上進行同步,如果使用了Boolean作為被同步對象,很可能會導(dǎo)致本來應(yīng)該沒有關(guān)系的兩個同步塊使用了相同對象的鎖。示例如下:
 
代碼4:
 

private volatile Boolean aBoolean = Boolean.FALSE; 
 
private volatile Boolean anotherBoolean = false; 
 
public void aMethod() { 
 ... 
 synchronized(aBoolean) { 
  //TODO: 訪問臨界資源1 
 } 
 ... 
} 
 
public void anotherMethod() { 
 ... 
 synchronized(anotherBoolean) { 
  //TODO: 訪問臨界資源2 
 } 
 ... 
} 

 假設(shè)原本aMethod和anotherMethod分別會被兩組沒有關(guān)系的線程調(diào)用。但是由于Boolean.FALSE和false指向的是同一個對象,可能導(dǎo)致對臨界資源2的訪問被臨界資源1阻塞了(反之亦然)。
 
以上兩種情況說明,在使用同步塊時,盡量不用使用Boolean對象作為被同步對象,不然可能會出現(xiàn)意想不到的問題,或者對以后的代碼修改造成陷阱。
 
從此也可以看出,任何對常量的同步都是有風(fēng)險的。如果一定要對 Boolean 進行同步,一定要用 new 操作符來創(chuàng)建 Boolean 對象。

相關(guān)文章

  • mybatis+springboot中使用mysql的實例

    mybatis+springboot中使用mysql的實例

    在軟件開發(fā)中,數(shù)據(jù)庫的引入是必不可少的,這里來展現(xiàn)一下通過mybatis框架在springboot中使用mysql,具有一定的參考價值,感興趣的可以了解一下
    2021-07-07
  • 解決scala.collection.mutable.Map寫入的問題

    解決scala.collection.mutable.Map寫入的問題

    這篇文章主要介紹了解決scala.collection.mutable.Map寫入的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Servlet實現(xiàn)文件的上傳與下載

    Servlet實現(xiàn)文件的上傳與下載

    這篇文章主要為大家詳細介紹了Servlet實現(xiàn)文件的上傳與下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java利用Socket和IO流實現(xiàn)文件的上傳與下載

    Java利用Socket和IO流實現(xiàn)文件的上傳與下載

    本文主要介紹了Java利用Socket和IO流實現(xiàn)文件的上傳與下載,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 解決Mybatis映射文件mapper.xml中的注釋問題

    解決Mybatis映射文件mapper.xml中的注釋問題

    這篇文章主要介紹了解決Mybatis映射文件mapper.xml中的注釋問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java集合之CopyOnWriteArrayList詳解

    Java集合之CopyOnWriteArrayList詳解

    這篇文章主要介紹了Java集合之CopyOnWriteArrayList詳解,CopyOnWriteArrayList是ArrayList的線程安全版本,內(nèi)部也是通過數(shù)組實現(xiàn),每次對數(shù)組的修改都完全拷貝一份新的數(shù)組來修改,修改完了再替換掉老數(shù)組,這樣保證了只阻塞寫操作,需要的朋友可以參考下
    2023-12-12
  • Java RSA加密解密實現(xiàn)方法分析【附BASE64 jar包下載】

    Java RSA加密解密實現(xiàn)方法分析【附BASE64 jar包下載】

    這篇文章主要介紹了Java RSA加密解密實現(xiàn)方法,結(jié)合實例形式分析了java基于第三方類庫javabase64-1.3.1.jar實現(xiàn)RSA加密解密功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • SpringBoot開發(fā)之攔截器實例

    SpringBoot開發(fā)之攔截器實例

    這篇文章主要介紹了SpringBoot開發(fā)之攔截器實例,Spring?Boot簡介Spring?Boot發(fā)展史SpringBoot的魅力SpringBoot的優(yōu)點總結(jié)Spring?Boot是一個基于Spring框架的快速開發(fā)腳手架,它簡化了Spring應(yīng)用的初始化和搭建過程,需要的朋友可以參考下
    2023-09-09
  • Java基于Rest?Assured自動化測試接口詳解

    Java基于Rest?Assured自動化測試接口詳解

    Rest Assured 是一個基于 Java 的流行的用于測試 RESTful API 的庫。這篇文章主要介紹了Java如何基于Rest?Assured實現(xiàn)自動化測試接口,需要的可以參考一下
    2023-03-03
  • 詳解Spring極速集成注解redis實錄

    詳解Spring極速集成注解redis實錄

    這篇文章主要介紹了詳解Spring極速集成注解redis實錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論