java - 在 Java 中,当对象中的一个方法是 'synchronized' 时,所有方法都是 'synchronized' 吗?

标签 java multithreading

我的理解是,当一个对象方法被“同步”时,该方法一次只允许一个线程。我对此进行了测试,它有效。

但是最近有人告诉我,线程必须获得控制权才能访问同步方法的“锁”是“对象锁”。这意味着该对象的所有方法(同步或非同步)都以同步方式有效运行。

我用 synchronized void method1();void method2(); 进行了测试,看起来很多线程都能够进入 method2 同时进行。

这个家伙指的这个“对象锁”是什么,它是如何工作的?

最佳答案

他的意思是,如果你有两个同步方法,它们将相互同步,而不仅仅是单独同步。这是因为在调用该方法的实例上持有对象锁。

换句话说,如果您有两个同步方法 foo()bar(),则没有线程可以在同时调用 bar()另一个线程正在调用 foo()

如果把定义写出来就很容易看出来。同步方法

public synchronized void foo() { 
  stuff;
}

相当于:

public void foo() { 
  synchronized(this) {
    stuff;
  }
}

对于没有关联实例的方法(即静态方法),将锁定类实例。

关于java - 在 Java 中,当对象中的一个方法是 'synchronized' 时,所有方法都是 'synchronized' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232372/

相关文章:

c# - 将托管线程上的模拟 token 传递给非托管线程

java - RMI 服务器自行关闭

java - 如何配置Camel的RedeliveryPolicy retriesExhaustedLogLevel?

java - 请求的资源不适用于 servlet 3.0 和 tomcat 7.0

java - 如何解密在.net中加密的java文件

java - 哪一段代码更好?

Java 7 路径匹配器 : Does ** match 0 directories?

JavaFx,多线程应用程序,奇怪的异常

.net - 如何在另一个线程中打开打印对话框

python - 运行开发服务器时,Bottle 框架的线程之一出现 OSError