我不明白這個類是不是線程安全的?
(你可能已經現在這個問題的答案,但我在這裏包括它的完整性。)
的問題是value++
聲明。這是一個多部分的聲明。
- 讀取
value
的值。
- 讀取的值增加1。
- 新值存儲在
value
。
該序列可以被另一個線程混合使用。說value
是5
。如果兩個線程調用getNext()
(在同一個實例中),那麼在完成後,您會預計value
爲7
。然而,如果兩個線程以前任何線程完成步驟1和2做第3步,他們都將寫入值6
到value
:
- 線程1做第1步 - 讀取
5
- 線程2做步驟1 - 將讀取
5
- 線程2執行步驟2 - 由
1
- 線程2做步驟3增量
5
- 保存的值6
- 線程1做步驟2 - 增量
5
通過1
- 線程1做第3步 - 保存
6
就不會在每次一個線程需要調用該方法GETNEXT()的時候,它會 首先創建的這個實例值類?
不是每一次。這將是new UnsafeSequence().getNext()
一遍又一遍,這是沒有道理的。但也許這不完全是你的意思。每個線程都可以擁有自己的類實例,並且可以調用getNext()
。在那種情況下,沒有問題。
兩個線程可以共享這個類的同一實例(除非明確 份額)?
不,必須以某種方式共享實例。但它可以在你不知情的情況下共享。例如,某些類可能有一個返回UnsafeSequence
實例的static
方法。你不知道它是否是每次都返回的實例,或者每次調用都創建一個新實例。 除非這是記錄在某處。
有關API文檔中類是否線程安全的討論,指的是在線程之間共享實例的情況。如果一個實例不共享,則可以在多線程應用程序中使用它,只需,因爲它只有一個線程可用。
我無法在那裏看到顯而易見的內容。謹慎地解釋這個問題的背景? – Forkmohit
謝謝。我明白什麼時候「分享」,見我問題的最後一句話。 – Forkmohit
對不起,我沒有得到最後一部分。你能否詳細說明一下。 –