Java并发编程的艺术-第一章<并发编程的挑战>

来源:互联网 发布:淘宝卖家论坛 编辑:程序博客网 时间:2024/05/18 20:48

引起死锁的demo代码:

package com.evan.concurrent.thread;/** * Created by evan on 2/26/17. */public class ThreadDeadLockTest {    public static final String A = "A";    public static final String B = "B";    public static void main(String[] args) throws Exception {        System.out.println("主线程开始。。。");        deadLock();        System.out.println("主线程结束。。。");    }    public static void deadLock() throws Exception{        Thread t1 = new Thread(new Runnable() {            public void run() {                synchronized (A){                    System.out.println(Thread.currentThread().getName()+"线程A执行1");                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    synchronized (B){                        System.out.println(Thread.currentThread().getName()+"线程B执行1");                    }                }            }        });        t1.start();        Thread t2 = new Thread(new Runnable() {            public void run() {                synchronized (B){                    System.out.println(Thread.currentThread().getName()+"线程B执行2");                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    synchronized (A){                        System.out.println(Thread.currentThread().getName()+"线程A执行2");                    }                }            }        });        t2.start();        System.out.println("主线程执行");    }}

输出结果:

主线程开始。。。主线程执行主线程结束。。。Thread-1线程B执行2Thread-0线程A执行1

线程1和线程2的输出可能是第二到第五行之间。

建议:
有的并发程序写的不严谨,在并发下如果出现问题,定位起来会比较耗时和棘手。所以,对于Java开发工程师而言,笔者强烈建议多使用JDK并发包提供的并发容器和工具类来解决并发问题,因为这些类都已经通过了充分的测试和优化。

0 0
原创粉丝点击