了解同步块和内部锁

时间:2014-08-26 22:28:04

标签: java multithreading synchronization

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

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

这就是我认为这段代码的作用:它告诉线程在它们可以运行someDataStructure.modifyInSomeWay()之前,它们需要获得dataStructure的内在锁。这是对的吗?

如果是,那么下一个假设是什么:当尝试访问成员同步方法或引用该对象的同步块时,线程只需要一个对象的内部锁 。在任何其他情况下,线程都不需要对象的锁定以便以任何方式搞乱它。

如果我的两个假设都是正确的,那么这意味着上面的代码实际上说明了以下内容:

  

"线程一旦获得,就只能运行这段代码   dataStructure的内在锁定。内在的锁定   dataStructure目前仅由另一个线程拥有   以下是真的:

     

A-一个线程当前正在运行synchornized方法   dataStructure

     

B-线程当前正在运行synchronized块引用   dataStructure

     

在任何其他情况下,例如当线程只是搞乱时   dataStructure的状态,内在锁是免费的。"

这准确吗?

1 个答案:

答案 0 :(得分:2)

  

它告诉线程在它们可以运行之前   someDataStructure.modifyInSomeWay(),他们需要获得内在的   锁定数据结构。这是对的吗?

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

  

线程只有在尝试访问时才需要对象的内部锁定   成员同步方法,或引用的同步块   对象

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

  

"线程一旦获得,就只能运行这段代码   数据结构的内在锁定。 dataStructure的内在锁   仅当下列之一出现时,才由另一个线程拥有   真:

     

A-线程当前正在dataStructure中运行同步方法。

     

B-线程当前正在运行引用dataStructure的同步块。

     

在任何其他情况下,例如当一个线程只是搞乱dataStructure时   状态,内在锁是免费的。"

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

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

相关问题