亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在多線程環境中以下列方式構造對象是否安全 問問題

在多線程環境中以下列方式構造對象是否安全 問問題

元芳怎么了 2022-08-03 09:57:28
public class DataEvent {    private static final AtomicInteger lastRevision = new AtomicInteger();    private final int revision;    private final long threadId;    private final long timestamp;    private DataEvent(int revision) {        this.revision = revision;        this.threadId = Thread.currentThread().getId();        this.timestamp = System.nanoTime();    }    public static DataEvent newInstance() {        return new DataEvent(lastRevision.incrementAndGet());    }}My questions are following:is it absolutely correct to say that all objects will be constructed consistently one by one? I mean that every new object is constructed later then previous one. In other words each new object has that is bigger then previous one.timestamphow keyword affects this behavior? As I understand if all object fields are then it makes constructor atomic in some way. Reference is not published until all fields are initialized.finalfinalfinalwhat is best practice to construct such objects? Is is enough to make atomic or should be declared as ?lastRevisionnewInstancesynchronized
查看完整描述

2 回答

?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

說所有對象都將一個接一個地一致地構造是絕對正確的嗎?

哈哈 是阻塞調用,但調度程序可以在收到第一個 ID 后暫停第一個線程,然后在第二個線程收到第二個 ID 后恢復它,這意味著兩個構造函數將同時執行。lastRevision.incrementAndGet()

換句話說,每個新對象的時間戳都比前一個對象大。

不,見上文。

關鍵字如何影響此行為?final

事實并非如此。

據我所知,如果所有對象字段都是最終的,那么它就會以某種方式使構造函數成為原子的。

不對。如果每個字段都是最終的,那么一個類是不可變的*,這使得它隱式線程安全。

構造此類對象的最佳實踐是什么?是否足以使原子化或應聲明為同步?lastRevisionnewInstance

如果必須按順序創建每個實例,則應進行同步。一旦是,原子整數就沒有意義了。即使這樣做,時間戳可能仍然相同,具體取決于基礎系統時鐘的分辨率。newInstance


*嗯,不完全是。如果每個字段都是最終的,并且本身也是不可變的


查看完整回答
反對 回復 2022-08-03
?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

  • 原子性保證僅對調用有效。所以,是的,對于每個新對象,修訂將是連續的,這是原子數據類型的目的。因此,為了回答您的問題:不能保證多個線程將按照調用 時相同的順序執行構造函數中的語句。要實現此目的,您必須將此部分放在塊中。incrementAndGet()incrementAndGet()synchronized

  • finals在這里沒有幫助。它們是純粹的邏輯功能,不允許在對象創建后改變字段。

  • 如果您確實需要時間戳與修訂對齊,則必須引入某種形式的線程同步。您可以使整個方法同步,然后不必是原子的。lastRevision

此外,無論您決定做什么,您可能還需要檢查其自身提供的保證。咔嚓System.nanoTime()


查看完整回答
反對 回復 2022-08-03
  • 2 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號