java - 拥有线程对象锁与类锁

标签 java multithreading

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/

相关文章:

c# - async await是否增加上下文切换

java - 我应该怎么做才能停止线程执行?

c# - 在没有同步的情况下修改可为空的 DateTimeOffset 字段是否线程安全

java - Firefox 上的 Selenium Webdriver 问题

java - 在android中用字符串中的另一个字符替换一个字符?

java - 尝试在 Eclipse Luna 中通过 Git 打开 Maven 项目时出现问题

java - 在 android 中使用 okhttp 在 webview 中发送每个请求的授权 header

c++ - 在 Windows 上的 C++ 中使用和创建 wxwidgets 中的线程

java - 缺少带锁和 ConcurrentHashMap 的更新

java - 与后端API交互