Java SE死锁
CAMELLIA死锁
一、什么是死锁
在多线程编程中,死锁是一种严重的问题,它发生在两个或多个线程互相等待对方持有的资源,导致所有线程都无法继续执行。
这种情况会导致程序挂起,无法正常运行。
二、死锁的四个必要条件
死锁通常发生在以下四个条件同时满足时:
- 互斥条件:至少有一个资源被一个线程独占,其他线程不能同时使用该资源。
- 请求与保持条件:一个线程已经持有至少一个资源,但又请求另一个资源,而该资源被其他线程持有。
- 不剥夺条件:线程所获得的资源在未使用完之前不能被剥夺,只能在使用完后自行释放。
- 循环等待条件:存在一个线程等待队列,例如:线程A等待线程B持有的资源,而线程B等待线程A持有的资源,从而形成一个等待环。
三、示例:产生死锁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package com.camellia.thread.deadlock;
public class DeadlockDemo { public static void main(String[] args) { Object lock1 = new Object(); Object lock2 = new Object(); Thread t1 = new Thread(new MyRunnable(lock1,lock2)); Thread t2 = new Thread(new MyRunnable(lock1,lock2)); t1.start(); t2.start(); } }
class MyRunnable implements Runnable { private Object o1; private Object o2;
public MyRunnable(Object o1, Object o2) { this.o1 = o1; this.o2 = o2; }
@Override public void run() { if(Thread.currentThread().getName().equals("Thread-0")){ synchronized (o1){ try { Thread.sleep(1000); synchronized (o2){} } catch (InterruptedException e) { e.printStackTrace(); } } }else{ synchronized (o2){ synchronized (o1){} } } } }
|