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)
您的问题是在同一对象上同步两次时会发生什么.
答案是:Java将首先检查哪个线程拥有监视器(这是运行的内部数据结构synchronized).由于所有者线程与当前线程相同,因此Java将继续.
只有当您有两个监视器并且尝试在不同线程中以不同顺序锁定它们时,才会发生死锁.