我有一個sinlgeton對象,它持有一個方法,女巫不同步。單身人士可以被許多客戶一次訪問 - 如果多個客戶訪問該對象會發生什麼?對象引用是否會以先來先服務的方式提供給他們?也就是說,一個客戶端是否必須等待第一個客戶端完成該對象,否則它將在內存中被賦予相同的對象引用?Java中Singleton併發訪問
我對不同步的單例中的方法有一種奇怪的感覺。如果2個客戶端調用Singleton.method(param),使用不同的參數 - 它們不會爲彼此造成問題嗎?
我有一個sinlgeton對象,它持有一個方法,女巫不同步。單身人士可以被許多客戶一次訪問 - 如果多個客戶訪問該對象會發生什麼?對象引用是否會以先來先服務的方式提供給他們?也就是說,一個客戶端是否必須等待第一個客戶端完成該對象,否則它將在內存中被賦予相同的對象引用?Java中Singleton併發訪問
我對不同步的單例中的方法有一種奇怪的感覺。如果2個客戶端調用Singleton.method(param),使用不同的參數 - 它們不會爲彼此造成問題嗎?
如果你的方法沒有使用任何共享狀態(例如singleton字段),這是完全安全的。方法參數在線程堆棧上傳遞 - 對於堆棧而言是本地和專用的。
想想兩個運行相同代碼但在內存中的不同區域運行的處理器。
單例表示應該只有一個類的實例。那麼,如果單身人士沒有得到適當的執行,這可能不會成立。擁有一個單身人士最安全的方式是將其聲明爲enum
。
如果有一個方法不同步,這意味着多個線程可以在同一時間執行該方法的主體。如果單身是不可改變的,那麼就不用擔心了。否則,你應該注意可能的不一致。一個線程可以改變狀態,而另一個線程可以改變狀態,從而導致難以調試的不可預知的結果。
謝謝。但是我仍然沒有明白,如果內存中沒有2個對象(由於單例),堆棧上會有兩個方法(同一個類)嗎? – WinOrWin
你的單例對象(它的實例字段)位於堆上。單例對象方法的代碼位於PermGen內存中(每個加載類一次,而不是對象)。方法參數在棧上傳遞,對每個線程都是本地的。三個不同的記憶位置,我建議你閱讀更多關於它們。 –