2 回答
TA貢獻1877條經驗 獲得超1個贊
說所有對象都將一個接一個地一致地構造是絕對正確的嗎?
哈哈 是阻塞調用,但調度程序可以在收到第一個 ID 后暫停第一個線程,然后在第二個線程收到第二個 ID 后恢復它,這意味著兩個構造函數將同時執行。lastRevision.incrementAndGet()
換句話說,每個新對象的時間戳都比前一個對象大。
不,見上文。
關鍵字如何影響此行為?
final
事實并非如此。
據我所知,如果所有對象字段都是最終的,那么它就會以某種方式使構造函數成為原子的。
不對。如果每個字段都是最終的,那么一個類是不可變的*,這使得它隱式線程安全。
構造此類對象的最佳實踐是什么?是否足以使原子化或應聲明為同步?
lastRevisionnewInstance
如果必須按順序創建每個實例,則應進行同步。一旦是,原子整數就沒有意義了。即使這樣做,時間戳可能仍然相同,具體取決于基礎系統時鐘的分辨率。newInstance
*嗯,不完全是。如果每個字段都是最終的,并且本身也是不可變的。
TA貢獻1866條經驗 獲得超5個贊
原子性保證僅對調用有效。所以,是的,對于每個新對象,修訂將是連續的,這是原子數據類型的目的。因此,為了回答您的問題:不能保證多個線程將按照調用 時相同的順序執行構造函數中的語句。要實現此目的,您必須將此部分放在塊中。
incrementAndGet()incrementAndGet()synchronizedfinals在這里沒有幫助。它們是純粹的邏輯功能,不允許在對象創建后改變字段。如果您確實需要時間戳與修訂對齊,則必須引入某種形式的線程同步。您可以使整個方法同步,然后不必是原子的。
lastRevision
此外,無論您決定做什么,您可能還需要檢查其自身提供的保證。咔嚓System.nanoTime()
添加回答
舉報
