我刚刚研究了synchronized方法和块的主题。我不完全了解同步块。例如:

synchronized(dataStructure){
    someDataStructure.modifyInSomeWay();
}


我认为这是此代码的作用:它告诉线程在运行someDataStructure.modifyInSomeWay()之前,它们需要获取dataStructure的固有锁。它是否正确?

如果是这样,那么下一个假设又如何呢:线程仅在尝试访问成员同步方法或引用该对象的同步块时才需要对象的固有锁。在任何其他情况下,线程都不需要以任何方式弄乱对象的锁。

如果我的两个假设都是正确的,则意味着以上代码实际上表示以下内容:


  “线程只有在获得了
  dataStructure的固有锁定。的内在锁
  dataStructure当前仅由以下一个线程拥有
  以下是正确的:
  
  A-线程当前正在运行synchornized方法
  dataStructure
  
  B-线程当前正在运行synchronized块引用
  dataStructure
  
  在任何其他情况下,例如当一个线程只是与
  dataStructure的状态,内部锁定是免费的。”


这个准确吗?

最佳答案

它告诉线程在它们可以运行之前
  someDataStructure.modifyInSomeWay(),他们需要获得内在的
  锁定dataStructure。它是否正确?


是。线程将阻塞,直到获得锁为止。


  线程仅在尝试访问对象时才需要对象的固有锁定。
  成员同步方法,或引用了
  宾语。


每当您看到synchronized时,都需要获取某些对象的锁才能继续执行。哪个对象取决于synchronized的使用。在static方法中,它是声明类的Class对象。在实例方法中,它是在其上调用方法的对象。在synchronized (..)块中,它是(..)中的表达式引用的对象。


  “线程只有在获得了
  dataStructure的固有锁定。 dataStructure的固有锁定
  当前仅由另一个线程拥有,只要满足以下条件之一
  真正:
  
  答:线程当前正在dataStructure中运行同步方法。
  
  B-线程当前正在运行一个引用了dataStructure的同步块。
  
  在任何其他情况下,例如当一个线程只是与dataStructure的混乱
  状态,固有锁定是免费的。”


弄不清楚最后一句话中的dataStructure状态是什么意思,目前尚不清楚。如果您只是想在任何synchronized上下文之外(在对象上)与对象进行交互,则可以。请注意,即使您在线程A的对象上使用了synchronized,线程B仍可以使用同一对象的非同步方法而不会阻塞。

但是A(假设实例方法)和B是正确的。

10-06 09:49