Java并发编程的艺术 记录(一)
模拟死锁
package com.gjjun.concurrent; /** * 模拟死锁,来源于《Java并发编程的艺术》 * @Author gjjun * @Create 2018/8/12 **/ public class DeadLockDemo { private static String A = "A"; private static String B = "B"; public static void main(String[] args) { DeadLockDemo deadLockDemo = new DeadLockDemo(); deadLockDemo.deadLock(); } /** * 下面代码将发生死锁,原因是线程0将A资源锁定,之后线程1将B资源锁定, * 之后线程1调用A资源,但是是锁定状态,所以等待A资源释放,但是A资源在2s后需要B * 资源,但是B资源却等待A资源释放,所以形成了相互依赖。 * * 可以在控制行输入命令 jps,查看类的id,之后使用jstack id查看是否发生了死锁 * * * 避免死锁的方式: * 1.避免一个线程同时获取多个锁。 * 2.避免一个线程同时占用多个资源,尽量保证一个锁一个资源。 * 3.尝试使用定时锁,使用lock.tryLock(timeout)来代替使用 * 4.对于数据库锁,加锁和解锁必须在一个数据库连接池里。 */ private void deadLock() { Thread thread1 = new Thread(new Runnable() { @Override public void run() { synchronized (A) { try { System.out.println("A"); Thread.currentThread(); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B) { System.out.println("1"); } } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { synchronized (B) { try { System.out.println("B"); Thread.currentThread(); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (A) { System.out.println("2"); } } } }); thread1.start(); thread2.start(); } }
下面是使用jstack命令查看的死锁状态,红色框内是死锁发生的类文件及行号。