java基礎|驗證i++的線程不安全


javaDEMO

本網站記錄了最全的各類JavaDEMO ,保證下載,複製就是可用的,包括基礎的, 集合的, spring的, Mybatis的等等各類,助力你從菜鳥到大牛,記得收藏哦~~
https://www.javastudy.cloudjava

i++的線程不安全

i++是咱們從開始學寫代碼時就一直在寫的一個語句,也時常有前輩說過,i++是線程不安全的,咱們今天就來一塊兒模擬下多個線程同時對i進行++操做
代碼以下:web

  
    
  
  
  
   
   
            
   
   

  
    
  
  
  
   
   
            
   
   
import java.util.concurrent.CountDownLatch;
public class IDemo {
public static void main(String[] args) {// 用CountDownLatch來計數,其主要有兩個方法// 1是await,使當前線程暫停// 2是countDown,使當前計數器減1,若是計數器減爲0,則暫停的線程能夠繼續執行 CountDownLatch latch = new CountDownLatch(1);// new了一個類,裏面持有爲0的 i TestCounter counter = new TestCounter();// 定義了線程操做,先調用latch的await方法等待計數器變成0// 而後執行counter.add方法,讓i++; Runnable runnable = () -> {try { latch.await(); counter.add(); } catch (InterruptedException e) { e.printStackTrace(); } };// 循環1000次,新建1000個線程for (int i = 0; i < 1000; i++) { Thread t = new Thread(runnable); t.start(); }// 這裏調用latch.countDown方法,讓計數器減爲0,則全部暫停的線程均可以執行try { latch.countDown();// 主線程暫停3秒,讓子線程能夠執行完 Thread.sleep(3000L); } catch (InterruptedException e) { e.printStackTrace(); }// 輸出最後執行完i++後i的值 System.out.println(counter.i);

}
/** * 使用內部類的方式,封裝i和i++操做 */static class TestCounter {int i = 0;
void add() { i++; }
}}

輸出結果以下:
屢次運行會有不一樣的結果
redis

DEMO總評

i++線程不安全是一個老生常談的問題,但真動手寫起代碼,仍是有很多坑的,在這份dome中,有的小夥伴會把countDownLatch設置爲100,也是能夠的,思路不同。無論哪種思路,能模擬出場景就能夠,關於CountDownLatch的用法,在其jdk源碼中有示例,你們能夠去看一看,加油吧,少年!spring

可添加小刀微信獲取源碼docker


往期熱文
docker|docker安裝redis
springboot|新建Controller和RestController接收請求
springboot|springboot新建aop切面
springboot|springboot配置定時任務及經常使用的cron表達式


點在看的都沒有bug!!!


本文分享自微信公衆號 - java技術大本營(java-ideashare)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。安全

相關文章
相關標籤/搜索