java、後端服務開發、程序員、面試Java資深開發
如果你是面試高級、資深軟件開發,多線程問題肯定會有的。
Java面試過程
- 面試官:說下操作int的多線程場景下怎麼控制線程安全
- 程序汪汪:記不清楚了,就知道個synchronized
- 面試官:(笑眯眯的望著你)那你等下hr過來問你幾個問題
回來查了下,AtomicInteger這個類可以保證線程安全,自增、自減
知識準備
什麼是線程安全性:多個線程訪問某個類時,這個類始終能表現正確的行為,那麼就說這個類是線程安全的。
同步:java同步關鍵字synchronized,提供了一種獨佔的加鎖方式。
原子性:最小單位不可分割性。如a++,實際是a=a+1,是可分割的,他不是原子性操作。非原子性操作就可能存在線程安全問題。使用synchronized可讓他變成原子操作。一個操作是原子操作我們就稱它具有原子性。
原子類:java的concurrent包下提供了一些原子類,如AtomicInteger、AtomicLong、
CountDownLatch:利用它可以實現類似計數器的功能
實現線程方式:Thread、Runnable、Callable
AtomicInteger:是一個提供原子操作的Integer類,線程安全的方式操作自增、自減等,因此適合高併發情況下使用。
- 多線程API大家多積累吧,java.util.concurrent包下牛逼類很多
代碼案例
![面試官:Java自增原子性問題,程序員:記不清楚了](http://p2.ttnews.xyz/loading.gif)
- 注意這裡CountDownLatch是10,如搞成11線程就永遠等待下去了
![面試官:Java自增原子性問題,程序員:記不清楚了](http://p2.ttnews.xyz/loading.gif)
- CountDownLatch調用await()方法的線程會被掛起,它會等待直到count值為0才繼續執行
- 運行結果
- 結論synchronized可以保證線程安全,AtomicInteger也能保證線程安全
總結
- 多線程下操作要線程安全,可以用java提供的原子類 或synchronized同步方法(這2個方式)
- volatile是隻能保證可見性,不能保證它具有原子性。
jdk源碼簡單分析
- 哪些原子性類
- AtomicInteger源碼
- volatile的作用是讓多個線程可以共享此變量,但是會導致效率較低。因此AtomicInteger類要在適合的場景下使用。
- Unsafe(不安全啊)是java HotSpot提供操作內存和線程的“後門”。
業務場景
- 在多線程業務裡,可以利用AtomicInteger去計算業務線程成功數量並記錄日誌
- final AtomicInteger successNum = new AtomicInteger();
- 偽代碼場景
我的其他java技術文章,歡迎一起學習交流
- 【最近更新】
- 【最近更新】
- 【最近更新】
閱讀更多 程序汪汪 的文章