說我有一個線程T1。我在該線程中創建了一個對象,例如Dog
和設置一些屬性(name
,color
)等MultipleThreads和同步線程可見性
然後我線程另一個線程T2(從T1)和Dog
對象傳遞給它。在此之後,T1不會更改對象的任何屬性,甚至不想讀取它,但會保留到實際參考(Dog d
)。
問:
- 假設T2不
Dog
改變什麼,狗是線程安全的(從知名度待機點將T2總是看到由T1設置相同的名稱和顏色。)?
說我有一個線程T1。我在該線程中創建了一個對象,例如Dog
和設置一些屬性(name
,color
)等MultipleThreads和同步線程可見性
然後我線程另一個線程T2(從T1)和Dog
對象傳遞給它。在此之後,T1不會更改對象的任何屬性,甚至不想讀取它,但會保留到實際參考(Dog d
)。
問:
Dog
改變什麼,狗是線程安全的(從知名度待機點將T2總是看到由T1設置相同的名稱和顏色。)?Dog
是線程安全只有當值只是實例變量震盪。
如果它們不是不穩定的,T2有可能讀取陳舊的數據。
「狗線程安全嗎?」如果它不是一成不變的,那麼我會說不。
「從知名度的角度來看,T2總是會看到與T1所設定的名稱和顏色相同的顏色嗎?」大概。 (注意,如果事情不揮發或同步。
簡單處理這個辦法是在其上同步。這將使它的tHead安全。
在一個線程中的每個動作可以看出,線程之前不管發生什麼事情開始在你的榜樣,T2是保證看到T1進行的所有更改t2.start()
被稱爲前。
這不會讓Dog
線程安全的,但你的這個類的使用是線程安全的。
然而要注意之後由T1或T2進行的任何後續更改點不能保證從其他線程可見。
參考:JLS #17.4.5:
調用開始()上線之前發生在啓動線程的任何行動。
只要:
Dog d
對象的屬性或
Dog d
時是免費的競態條件「 s屬性的訪問受到保護,免受競爭條件的影響...你可以認爲它是線程安全的。
我現在說現在不可能說你的解決方案是否是線程安全的。因爲沒有提及數據訪問原理或鎖。
我懷疑它不是線程安全的!
兩個線程都不改變Dog實例,它絕對是線程安全的 – hoaz
僅僅因爲你選擇不改變對象並不意味着它是線程安全的。使用這個邏輯,* everything *將是線程安全的。您似乎在談論Java的線程緩存而不是線程的可見性*安全* –