Cha*_*ani 6 java concurrency multithreading deadlock locking
根据我的理解,下面的代码应该导致死锁.原因是,当线程t1锁定静态对象firstData时,他已经获得了对类的锁定.因此,当他试图锁定另一个静态对象secondData时,请求应该阻塞.
但是,该程序运行良好并打印 *** Successfully acquired both the locks
锁定静态对象的原因是什么?
public class Deadlock {
public static void main(String[] args) {
Thread t1 = new Thread(new DeadlockRunnable());
t1.start();
}
}
class DeadlockRunnable implements Runnable {
static Object firstData = new Object();
static Object secondData = new Object();
public void run() {
synchronized(firstData) {
synchronized(secondData) {
System.out.println("*** Successfully acquired both the locks");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于那些谁回答了锁的对象,而不是类,请看看这个
Mar*_*ers 14
首先,你有一个错误:
原因是,当线程t1锁定静态对象firstData时,他已经获得了对类的锁定.
锁定静态对象仅锁定该对象,而不是类.您正在锁定两个单独的对象.
您提到的问题是同步方法而不是同步语句.这两个相关的结构以稍微不同的方式工作.
其次,即使您锁定了同一个对象,您的代码仍然不会死锁(ideone).内在锁是可重入的.这意味着如果线程尝试两次使用相同的锁,则线程不会自行死锁.
可重入同步
回想一下,线程无法获取另一个线程拥有的锁.但是一个线程可以获得它已经拥有的锁.允许线程多次获取相同的锁可启用重入同步.这描述了一种情况,其中同步代码直接或间接地调用也包含同步代码的方法,并且两组代码使用相同的锁.在没有可重入同步的情况下,同步代码必须采取许多额外的预防措施,以避免线程导致自身阻塞.
| 归档时间: |
|
| 查看次数: |
287 次 |
| 最近记录: |