Possible Duplicate:
What is the difference between synchronized and static synchronized?
对象锁比类锁有什么优势?
例如,
public static void log2(String msg1, String msg2){
synchronized(MyClass.class){
log.writeln(msg1);
log.writeln(msg2);
}
}
并且,
public void log2(String msg1, String msg2){
synchronized(this){
log.writeln(msg1);
log.writeln(msg2);
}
}
最佳答案
如果您在类上创建锁,则该类的所有实例都将共享该锁。如果你有 1 个实例,就不会有任何区别。如果您有数千个实例,它们都将使用相同的锁。如果许多线程试图同时获取锁,它们就会互相阻塞。在最坏的情况下,这可能会导致您的代码表现得好像根本没有线程一样。
如果在实例上创建锁,那么只要在不同的实例上操作,多个线程就可以执行 protected 代码。在这里,线程不会互相阻塞。所以这种方法表现更好。
但这不是你需要问的。真正的问题是:我需要什么样的锁?
如果您想确保只有一个线程可以写入日志,您应该在log
上进行同步。这种方法还有一个额外的优点,即当您开始使用多个日志文件(例如,每个线程一个)时,它会自动正确工作。
关于java - 拥有线程对象锁与类锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894924/