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
- Java并发编程的艺术-第一章<并发编程的挑战>
- 并发编程的艺术笔记-(第一章)并发编程的挑战
- Java并发编程的艺术-第一章之并发编程的挑战
- 《Java并发编程的艺术》第一章——并发编程的挑战
- java并发编程的艺术【一】并发编程的挑战
- 第一章 并发编程的挑战
- 第一章 并发编程的挑战
- 第一章 并发编程的挑战 总结
- 《Java并发编程的艺术》笔记(1)-并发编程的挑战
- Java并发编程的艺术(一)-----并发编程的挑战及解决方案
- 《Java并发编程的艺术》——第一章总结
- Java并发编程的艺术
- Java并发编程的艺术
- 并发编程的挑战
- Java并发编程(一):并发编程的挑战
- java并发编程学习(一) 并发编程的挑战
- 《并发编程的艺术》学习笔记 第1章---并发编程的挑战
- Java并发编程的艺术(上)
- usaco2.3 nocows dp + 失败的递归
- jQuery选择器之特殊选择器this
- 自考--计算机网络
- JAVA蓝桥杯:高精度算法
- linux中ps命令所得内容的解释
- Java并发编程的艺术-第一章<并发编程的挑战>
- GPL协议是什么?
- datetime 时间,日期相关操作
- Python12
- 表单校验
- SVG开发系列(一)
- PAT 1126. Eulerian Path (25)-甲级
- GPL协议
- Coupled Generative Adversarial Networks 阅读笔记