Java产生死锁的例子
产生死锁的原因
- 系统资源的竞争:系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。
- 进程运行推进顺序不合适:进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。
思路:创建两个线程A、B,再创建对应的两个字符串a和b,如果A锁住a,B锁住b,A就没办法锁住b,B也没办法锁住a,就会发生死锁。
/**
* demo:该案例为了展示死锁
*/
public class Die_lock {
//创建两个锁的对象
public static String as="as";
public static String bs="bs";
public static void main(String[] args) {
//开启两个线程
new Thread(new A()).start();
new Thread(new B()).start();
}
}
class A implements Runnable{
@Override
public void run() {
while(true){
synchronized (Die_lock.as){
System.out.println("a被上锁!");
try {
//让B有时间锁住b
Thread.sleep(3000);
synchronized (Die_lock.bs){
System.out.println("a中锁b");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class B implements Runnable{
@Override
public void run() {
while(true){
synchronized (Die_lock.bs){
System.out.println("b被上锁!");
try {
Thread.sleep(3000);
synchronized (Die_lock.as){
System.out.println("b中锁a");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
运行结果如下:
分析:线程A 启动时,先锁住了a,然后A线程被暂停了3秒,让B有足够时间去锁住b,然后B又暂停3秒。这时,A线程想要继续执行,去锁住b,发现b已经被锁住。然后B想锁a,a早已被A锁住,这样双方都在等对方放锁,导致死锁。