我可以在此獲得您的看法。是否同步兩個方法分別等效於同步調用這兩個方法的塊?
「鑑於這種情況下:這個類是爲了讓用戶寫一系列消息,讓每一個消息都被標識一個時間戳和寫消息的線程的名稱
public class Logger
{
private StringBuilder contents = new StringBuilder();
public void log(String message)
{
contents.append(Thread.currentThread().getName());
contents.append("message");
contents.append("\n");
}
public String getContents()
{
return contents.toString();
}
}
如何我們可以確保這個類的實例可以被多個線程安全地使用嗎?「
顯然,正確的答案是「同步log()和getContents()」。
在我看來,這仍然不夠,因爲一個線程在調用getContent()方法時仍然可能拉出其他線程的消息。我錯了嗎?
在編寫消息和最終調用getContent()之間,線程是否會失去對另一個線程的鎖定?
例如在UtilityClass
Logger logger = new Logger();
在MyThread的
..
// Get logger instance
Logger myLogger = utilityClass.getLogger();
// doSomething else, release lock on 'logger' instance
// other thread gets the Logger from utility class, and invokes the log() method on it
// MyThread now calls getContent(), getting the other thread's message
myLogger.getContent()
?
謝謝!
定義「安全」。如果同步兩個方法,那麼:一個日誌消息不會被添加到另一個日誌消息中,'getContents'永遠不會返回一半的日誌消息(在最後切斷),並且它不會因爲併發問題而崩潰。 – immibis
沒有人說任何線程都不應該看到其他線程的消息。也不需要在寫入數據和獲取內容之間保持鎖定。 – RealSkeptic
不完全是因爲在同步黑色情況下,您正在限制用戶從同步塊調用。但用戶可能會同步調用這些方法,所以更好的方法是使方法同步。 – Prashant