Java并发编程的艺术 记录

Posted Mr、Guo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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命令查看的死锁状态,红色框内是死锁发生的类文件及行号。

 

以上是关于Java并发编程的艺术 记录的主要内容,如果未能解决你的问题,请参考以下文章

JAVA并发编程艺术 一(并发编程的挑战)

并发编程艺术-锁类型以及底层原理

读《Java并发编程的艺术》

[并发编程的艺术] 02-Java并发机制的底层实现原理

Java并发编程的艺术下载 𦄭

《Java并发编程的艺术》之ConcurrentLinkedQueue