java - 在同一个对象上同步两次?

标签 java multithreading synchronization mutex

我想知道在 Java 中如果我在同一个对象上同步两次是否会出现任何奇怪的行为?

场景如下

pulbic class SillyClassName {

    object moo;
    ...
    public void method1(){
        synchronized(moo)
        {
            ....
            method2();
            ....
        }
    }

    public void method2(){
        synchronized(moo)
        {
            doStuff();
        }
    }
}

两种方法都使用对象并在其上同步。第二个方法被第一个方法调用时会因为被锁定而停止吗?

我不这么认为,因为它是同一个线程,但我不确定可能会出现任何其他奇怪的结果。

最佳答案

可重入

同步块(synchronized block)使用重入锁,这意味着如果线程已经持有锁,它可以重新获取它而不会出现问题。因此,您的代码将按预期工作。

见底部 Java TutorialIntrinsic Locks and Synchronization .

自 2015 年 1 月起引用……

Reentrant Synchronization

Recall that a thread cannot acquire a lock owned by another thread. But a thread can acquire a lock that it already owns. Allowing a thread to acquire the same lock more than once enables reentrant synchronization. This describes a situation where synchronized code, directly or indirectly, invokes a method that also contains synchronized code, and both sets of code use the same lock. Without reentrant synchronization, synchronized code would have to take many additional precautions to avoid having a thread cause itself to block.

关于java - 在同一个对象上同步两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/249867/

相关文章:

java : accessing parent variable in multi threaded programe

java - 斯坦福解析器 - 多线程问题 - LexicalizedParser

java - 在线程之间共享一个变量?

java - 架构:在不污染 POJO 的情况下操作模型的最佳实践?并且无需到处重复样板代码

java - 为什么读取功能会自动将4k图像转换为1080p?

java - 为什么编译器没有捕捉到这个错误?

c++ - iPhone : starting an NSThread from a C++ object

java - 使用 PaintComponent 在 Jpanel 上绘制矩形不起作用

java - 使用 Collections.synchronizedSet 的每个语法

c - 为什么持有自旋锁时不允许 "sleeping"?