簡體   English   中英

如何在Java中沒有AtomicInteger的情況下確保原子性?

[英]how to assure atomicity without AtomicInteger in java?

假設Java 6/7/8:

不使用例如AtomicInteger是否有可能標記某些原子語句? 從我的小型研究來看,這似乎通常是不可能的,但是整數/字節/字符運算本身是原子的( )。

顯然,已經synchronized但是在這一點上我想避免它。 所以問題來了:我可以像atomic(x++)嗎?

我的建議是:如果您正在執行多線程編程,請盡快開始同步。 原子性適用於小型數據類型,但是一旦您想從不同的線程訪問類實例,就需要考慮同步,方法是使用synchronized或顯式操作鎖。

盡管從不會使變量處於不一致狀態的意義上說,單個int讀取和寫入是原子的,但這不是原子性上唯一重要的事情。 特別是在現代CPU中,指令和緩存內存會重新排序,因此其他線程可能看不到對變量的更改(可以通過在變量中添加volatile關鍵字來解決。

此外, AtomicInteger和朋友還提供了由多個操作組成的操作,例如getAndIncrement()方法,該方法類似於使用postfix ++運算符。 這由讀寫組成,如果您不同步或不使用AtomicInteger ,則其他線程可能會在讀寫之間訪問變量。

您的選擇是:

  • 通過synchronized關鍵字進行內部鎖定
  • 使用java.util.concurrent.locks顯式鎖來包裝要使其原子化的操作

如果要從多個線程讀取和寫入變量,則確實需要對變量強加一些原子性。 您不能依賴於本質上是原子的操作,因為變量的值可以被線程緩存。 因此,一個線程可能看不到另一個線程的更新。 解決此問題的最簡單方法是聲明一個變量volatile ,以強制讀取最新值。 java.util.concurrent類提供了額外的功能和良好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM