我刚刚研究了synchronized
方法和块的主题。我不完全理解同步块。例如:
synchronized(dataStructure){
someDataStructure.modifyInSomeWay();
}
这就是我认为这段代码的作用:它告诉线程在它们可以运行someDataStructure.modifyInSomeWay()
之前,它们需要获得dataStructure
的内在锁。这是对的吗?
如果是,那么下一个假设是什么:当尝试访问成员同步方法或引用该对象的同步块时,线程只需要一个对象的内部锁 。在任何其他情况下,线程都不需要对象的锁定以便以任何方式搞乱它。
如果我的两个假设都是正确的,那么这意味着上面的代码实际上说明了以下内容:
"线程一旦获得,就只能运行这段代码
dataStructure
的内在锁定。内在的锁定dataStructure
目前仅由另一个线程拥有 以下是真的:A-一个线程当前正在运行
synchornized
方法dataStructure
。B-线程当前正在运行
synchronized
块引用dataStructure
。在任何其他情况下,例如当线程只是搞乱时
dataStructure
的状态,内在锁是免费的。"
这准确吗?
答案 0 :(得分:2)
它告诉线程在它们可以运行之前
someDataStructure.modifyInSomeWay()
,他们需要获得内在的 锁定数据结构。这是对的吗?
是。线程将阻塞,直到获得锁定。
线程只有在尝试访问时才需要对象的内部锁定 成员同步方法,或引用的同步块 对象
无论何时看到synchronized
,都需要获取某些对象的锁定才能继续执行。哪个对象取决于synchronized
的使用。在static
方法中,它是声明类的Class
对象。在实例方法中,它是调用该方法的对象。在synchronized (..)
块中,它是(..)
中表达式引用的对象。
"线程一旦获得,就只能运行这段代码 数据结构的内在锁定。 dataStructure的内在锁 仅当下列之一出现时,才由另一个线程拥有 真:
A-线程当前正在dataStructure中运行同步方法。
B-线程当前正在运行引用dataStructure的同步块。
在任何其他情况下,例如当一个线程只是搞乱dataStructure时 状态,内在锁是免费的。"
目前还不清楚在最后一句话中弄乱了dataStructure的状态是什么意思。如果你的意思是简单地与任何synchronized
上下文之外的对象(在对象上)进行交互,那么是的。请注意,即使您在具有线程A的对象上有synchronized
,线程B仍然可以使用同一对象的非同步方法而不会阻塞。
但是A(假设实例方法)和B是正确的。