【问题标题】:When a Synchronized method is executed in a Java class, which Object is getting locked?在 Java 类中执行 Synchronized 方法时,哪个对象被锁定?
【发布时间】:2015-10-16 12:37:58
【问题描述】:

当在 Java 类中执行 Synchronized 方法时,哪个对象会被锁定?

【问题讨论】:

  • 类本身(Class<?> 对象)
  • 投票结束作为离题,因为这个问题不是关于编程问题。即,该问题不包含 OP 编写的任何代码示例,也没有询问为什么代码未能满足 OP 的期望。

标签: java multithreading


【解决方案1】:

对于静态方法,类被锁定

class A { 
    static synchronized void method() {

很像,虽然不完全一样

class A { 
    static void method() {
        synchronized(A.class) {

在这种情况下——如果一个线程已经在执行这个方法,那么没有其他线程可以调用这个方法。
对于实例方法,实例被锁定。

class A { 
    synchronized void method() {

差不多
class A { 
    void method() {
        synchronized(this) {

在这种情况下——如果有不同的实例对象被初始化,那么每个实例一个线程可以进入这个执行块。

注意:一种常见的误解是方法中有锁或方法被锁定。事实并非如此,事实上也没有标准的方法来做到这一点。

【讨论】:

  • 如果您确实理解了这个问题,您可以编辑它以使其更清晰
  • @SleimanJneidi 如果这是您正在寻找的答案,那么问题就很清楚了。我不经常投反对票,但有些人反对他们认为你应该知道的真正基本的 Java 问题。
  • 您说您的第二个示例与您的第一个示例“不完全相同”,但是 synchronized 实例方法和其整个实例方法之间是否有任何实际区别body 是一个单一的synchronized(this) 声明?我所说的“实际差异”并不是指您可以通过检查字节码来判断的东西。我的意思是,您是否可以编写任何纯 Java 单元测试来揭示这两种情况之间的差异。
  • @PeterLawrey 但是我们不需要鼓励初学者在发布内容之前进行基础研究吗?通过回答他们,我们并没有帮助他们 IMO。
  • @SleimanJneidi 我同意重新进行基础研究,但是这个问题是我记得很久以前想知道的问题之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 2010-10-01
  • 2017-07-25
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多