死锁
话不多说,直接上代码:
1 public class DeadlockTest { 2 private static final Object o1 = new Object(); 3 private static final Object o2 = new Object(); 4 5 public static void main(String[] args) { 6 new Thread(new Runnable() { 7 public void run() { 8 for (; ; ) { 9 synchronized (o1) { 10 System.out.println("A线程获取o1锁"); 11 synchronized (o2) { 12 System.out.println("继续执行要持有o2锁"); 13 } 14 } 15 } 16 } 17 }, "A").start(); 18 new Thread(new Runnable() { 19 public void run() { 20 for (; ; ) { 21 synchronized (o2){ 22 System.out.println("B线程获取o2锁"); 23 synchronized (o1){ 24 System.out.println("继续执行要持有o1锁"); 25 } 26 } 27 } 28 } 29 }, "B").start(); 30 } 31 }
通过jconsole分析工具可以看到确实存在死锁情况,B锁被A线程持有,A锁被B线程持有,线程A和线程B相互等待对方所持有锁的释放,而导致系统不能继续运行下去
那么,在我们实际做项目时候,如何避免死锁的发生呢?
1、避免一个线程同时获取多个锁
2、避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
3、尝试使用定时锁,使用lock.tryLock(timeout);来代替使用内部锁机制
4、对于数据库锁,加锁和解锁必须在同一个数据库连接里,否则出现解锁失败的情况