我可以在此获得您的看法。是否同步两个方法分别等效于同步调用这两个方法的块?
“鉴于这种情况下:这个类是为了让用户写一系列消息,让每一个消息都被标识一个时间戳和写消息的线程的名称
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