[英]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.