面試官:Java自增原子性問題,程式設計師:記不清楚了

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自增原子性問題,程序員:記不清楚了

  • 注意這裡CountDownLatch是10,如搞成11線程就永遠等待下去了
面試官:Java自增原子性問題,程序員:記不清楚了

  • CountDownLatch調用await()方法的線程會被掛起,它會等待直到count值為0才繼續執行
面試官:Java自增原子性問題,程序員:記不清楚了

  • 運行結果
  • 結論synchronized可以保證線程安全,AtomicInteger也能保證線程安全
面試官:Java自增原子性問題,程序員:記不清楚了

總結

  • 多線程下操作要線程安全,可以用java提供的原子類synchronized同步方法(這2個方式)
  • volatile是隻能保證可見性,不能保證它具有原子性。

jdk源碼簡單分析

  • 哪些原子性類
面試官:Java自增原子性問題,程序員:記不清楚了

  • AtomicInteger源碼
  • volatile的作用是讓多個線程可以共享此變量,但是會導致效率較低。因此AtomicInteger類要在適合的場景下使用。
  • Unsafe(不安全啊)是java HotSpot提供操作內存和線程的“後門”。
面試官:Java自增原子性問題,程序員:記不清楚了

面試官:Java自增原子性問題,程序員:記不清楚了

業務場景

  • 在多線程業務裡,可以利用AtomicInteger去計算業務線程成功數量並記錄日誌
  • final AtomicInteger successNum = new AtomicInteger();
  • 偽代碼場景
面試官:Java自增原子性問題,程序員:記不清楚了

我的其他java技術文章,歡迎一起學習交流



  • 【最近更新】

  • 【最近更新】

  • 【最近更新】







分享到:


相關文章: