Java中的同步?

DJ_*_*J_R 1 java synchronization synchronized synchronize

我是线程安全编程的新手,并且想知道我是否有类似下面的内容,一旦编译并运行,它是否可以安全地从死锁中解脱出来?

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();
Run Code Online (Sandbox Code Playgroud)

Ric*_*chN 6

您的代码只显示一个线程.

只有一个线程,你无法解决任何僵局.

补充:
Java语言支持他们正式称之为可重入同步的东西.它基本上意味着单个线程可以重新获取它已拥有的锁.


Aar*_*lla 5

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

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

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