Java中的同步?
我是线程安全编程的新手,我想知道如果我有下面这样的东西,一旦编译并运行,这会不会安全地避免死锁Java中的同步?,java,synchronization,synchronized,synchronize,Java,Synchronization,Synchronized,Synchronize,我是线程安全编程的新手,我想知道如果我有下面这样的东西,一旦编译并运行,这会不会安全地避免死锁 public class Foo { protected CustomClass[] _mySynchedData = new CustomClass[10]; public void processData() { synchronized(_mySynchedData) { // ...do stuff with synch
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();
您的代码只显示一个线程 只有一个线程,就不可能出现死锁 新增:
Java语言支持他们官方所说的。
它基本上意味着一个线程可以重新获得它已经拥有的锁。您的代码只显示一个线程 只有一个线程,就不可能出现死锁 新增:
Java语言支持他们官方所说的。
这基本上意味着单个线程可以重新获取它已经拥有的锁。Java synchronized关键字获取的锁支持嵌套,因此您不会因为在同一线程中多次同步同一对象而冒死锁的风险。Java synchronized关键字获取的锁支持嵌套,因此,在同一线程中多次同步同一对象不会有死锁的风险。RichN是正确的,因为您的代码只包含一个线程,因此死锁是不可能的。还请注意,要发生死锁,需要多个线程获取多个锁(尽管顺序不同),才能发生死锁
您的代码当前仅引用一个锁:与
\u mySynchedData
关联的锁。您尝试两次锁定它并不重要,因为Java中的锁是可重入的,RichN是正确的,因为您的代码只包含一个线程,因此不可能出现死锁。还请注意,要发生死锁,需要多个线程获取多个锁(尽管顺序不同),才能发生死锁
您的代码当前仅引用一个锁:与
\u mySynchedData
关联的锁。您尝试两次锁定它并不重要,因为Java中的锁是可重入的,您的问题是在同一对象上同步两次会发生什么
答案是:Java将首先检查哪个线程拥有监视器(这是synchronized
操作的内部数据结构)。由于所有者线程与当前线程相同,Java将继续
只有当您有两个监视器,并且您尝试在不同的线程中以不同的顺序锁定它们时,才会发生死锁。您的问题是在同一对象上同步两次时会发生什么 答案是:Java将首先检查哪个线程拥有监视器(这是
synchronized
操作的内部数据结构)。由于所有者线程与当前线程相同,Java将继续
死锁只能发生在您有两个监视器,并且您试图在不同的线程中以不同的顺序锁定它们的情况下。事实上,如果它不支持嵌套(并非所有的锁都支持),我很好地将其称为死锁,即使只涉及一个线程。事实上,如果它不支持嵌套(并非所有的锁都支持),我可以称之为死锁,即使只涉及一个线程。