【问题标题】:Understanding synchronized blocks and intrinsic locks了解同步块和内在锁
【发布时间】:2014-08-26 22:28:03
【问题描述】:

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

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

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

如果是,那么下一个假设如何:线程在尝试访问成员同步方法或引用对象的同步块时仅需要对象的内在锁。在任何其他情况下,线程不需要对象的锁就可以以任何方式干扰它。

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

"一个线程只有在获得了 dataStructure 的内在锁。的内在锁 dataStructure 当前由另一个线程拥有,仅当其中一个 以下是正确的:

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

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

在任何其他情况下,例如当一个线程只是在搞乱 dataStructure 的状态,内部锁是空闲的。”

这准确吗?

【问题讨论】:

    标签: java multithreading synchronization


    【解决方案1】:

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

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

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

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

    "一个线程只有在获得了 dataStructure 的内在锁定。 dataStructure 的内在锁 仅当满足以下条件之一时,当前由另一个线程拥有 真的:

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

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

    在任何其他情况下,例如当一个线程只是在搞乱 dataStructure 的 状态,内在锁是空闲的。”

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

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

    【讨论】:

    • “免费”是指“当前由另一个线程拥有”的反义词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多