恩.....,我试了一下!死锁只出现了一次! 在第二个程序中,可是以后就不出现死锁了! 而且!不知道是我看错了没有! 你说:把锁换成非静态是另一种情况! 可是你的最后两个程序是一样的啊!恩....,这是我的一个死锁的例子!你看一下! 上面也有我的注释:
public class DeathLock{
public static void main(String[] args) {
/**
首先前提条件线程 0 和线程 1 同时开启,CPU 切换到线程 0,打印输出 Thread-0:1,这时 CPU 切换到 线程 1 打
印输出 Thread-1:3, 当线程 1 继续执行内部的同步代码块的时候发现内部的同步代码块和线程 0
的外部同步代码块使用了相同的锁对象 lock1,所以线程 1 会等待 CPU 切换到线程 0 等待与之同步的代码执行完毕,
当线程 0 重新获取到 CPU 资源继续执行自身内部的同步代码块的时候发现线程 1 中的外部同步代码块和它具有同样的锁对象
lock2,所以线程 0 就会等待 CPU
切换到线程 1 等待与之同步的代码执行完毕,而这时线程 1 也在等待线程 0 的执行完毕,2 组代码相互等待,出现死锁。
*/
final Object lock1 = new Object();
final Object lock2 = new Object();
/** 线程 0 **/
new Thread() {
public void run() {
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + ":1");
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + ":2");
}
}
};
}.start();
/** 线程 1 **/
new Thread() {
public void run() {
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + ":3");
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + ":4");
}
}
};
}.start();
}
}
|