我是线程安全编程的新手,我想知道我是否有下面这样的东西,一旦编译并运行,这会不会避免死锁?
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条答案
按热度按时间cotxawn71#
java synchronized关键字获得的锁支持嵌套,因此在同一线程中多次同步同一对象不会有死锁的风险。
ssgvzors2#
您的代码只显示一个线程。
只有一个线程,就不可能出现死锁。
补充:
java语言支持他们正式称之为可重入同步的东西。它基本上意味着单个线程可以重新获得它已经拥有的锁。
5gfr0r5j3#
richn是正确的,因为您的代码只包含一个线程,因此死锁是不可能的。还要注意,要发生死锁,需要多个线程获取多个锁(尽管顺序不同),才能发生死锁。
您的代码当前只引用一个锁:与
_mySynchedData
. 两次尝试锁定它并不重要,因为java中的锁是可重入的。0tdrvxhp4#
你的问题是在同一个对象上同步两次会发生什么。
答案是:java将首先检查哪个线程拥有监视器(这是监视器的内部数据结构)
synchronized
操作)。由于所有者线程与当前线程相同,java将继续。死锁只有在您有两个监视器并且您试图在不同的线程中以不同的顺序锁定它们时才会发生。