1

我对线程安全编程很陌生,想知道是否有类似下面的内容,一旦编译并运行,这是否可以避免死锁?

public class Foo  
{  
    protected CustomClass[] _mySynchedData = new CustomClass[10];

    public void processData()
    {
        synchronized(_mySynchedData) {
            // ...do stuff with synched variable here
        }
    }
}


public class Bar extends Foo
{

    @Override
    public void processData()
    {
        synchronized(_mySynchedData) {
            // perform extended functionality on synched variable here

            // ...then continue onto parent functionality while keeping synched
            super.processData();
        }
    }
}


Bar testObj = new Bar();

// Deadlock?
testObj.processData();
4

4 回答 4

6

您的代码仅显示一个线程。

只有一个线程,你不可能得到任何死锁。

补充:
Java 语言支持他们官方所说的可重入同步。这基本上意味着单个线程可以重新获取它已经拥有的锁。

于 2009-11-02T09:00:14.953 回答
5

您的问题是当您在同一个对象上同步两次时会发生什么。

答案是:Java 将首先检查哪个线程拥有监视器(即synchronized操作的内部数据结构)。由于所有者线程与当前线程相同,Java 将继续。

只有当您有两个监视器并且您尝试在不同的线程中以不同的顺序锁定它们时,才会发生死锁。

于 2009-11-02T09:04:01.513 回答
4

Java synchronized 关键字所取的锁支持嵌套,因此您不会因为在同一个线程中对同一个对象进行多次同步而冒死锁的风险。

于 2009-11-02T09:02:53.720 回答
1

RichN 是正确的,因为您的代码只包含一个线程,因此死锁是不可能的。另请注意,要发生死锁,您需要让多个线程获取多个锁(尽管顺序不同)才能发生死锁。

您的代码当前仅引用一个锁:与_mySynchedData. 您尝试锁定它两次的事实并不重要,因为 Java 中的锁是可重入的。

于 2009-11-02T09:03:52.247 回答