2014-10-16 95 views
2

在我最近的採訪中通過解釋的情況下,他們問,如果這個過程是線程安全的進程線程是否安全?

有兩種同步方法之一是靜態的,其他是不固定的,即,非靜態方法A和靜態方法B.這兩種方法訪問共享數據。

現在線程A調用非靜態方法A並且線程B調用靜態方法B.這個線程是否安全並解釋y?

回答

5

不,它不是線程安全的。爲了線程安全,不同的線程必須使用同一個鎖訪問共享數據,但這兩種方法使用不同的鎖。將靜態方法同步使用類作爲鎖,將實例方法上的同步使用該對象作爲鎖。

如果線程使用不同的鎖,那麼這兩個線程都不會被阻塞,並且兩者都可以同時訪問或修改數據。即使線程只訪問數據,並且都不修改它,鎖定將確保內存可見性。沒有共享鎖,你不能依靠這種可見性。只有數據是不可變的,無限制的併發訪問纔是安全的,並且已經是safely published

假設共享數據必須是可變的,修復將是兩個方法使用相同的鎖。你可以隨時指定自己的鎖,如果你使用同步塊(而不是添加同步到方法),所以實例方法可以使用:

public void yourInstanceMethod() { 
    synchronized(WhateverYourClassIs.class) { 
     // code accessing shared data 
    } 
} 
+0

嗨Nathan,謝謝你的迴應。你能否詳細說明這個解釋。 – Anonymous 2014-10-16 14:27:56

+1

@匿名:你能讓我知道哪部分不清楚嗎?如果您需要添加更多細節,您可以編輯該問題。 – 2014-10-16 14:28:38

+0

我現在很清楚,有沒有辦法解決這個問題? – Anonymous 2014-10-16 14:31:29