Java 死锁的例子
2016-07-26 20:07
459 查看
《并发的挑战》学习标注
多线程是我觉得初入JAVA中的一个难点,之前一直知道线程有阻塞死锁的状态,但是很抽象,但是真的让我自己写一个死锁的例子,我还真的有点下笔难的感觉,今天看到这本书的第一章,就学习到了一个简单的线程死锁例子,在这里分享出来:
运行之后可以看到输出结果为:
可以看到输出的结果是A1,B2说明两个线程都开始启动了。并且都进入了一开始的synchronized方法,然后由于方法1锁住了A,方法2锁住了B,导致第二段代码再去获取对方的对象String的锁的时候失败,所以可以看到synchronized的作用,是锁住传入进来的当前对象,传的是什么,就锁什么。如果传的是对象的.class,那么就锁住整个类,也是单例模式的很好的例子。
多线程是我觉得初入JAVA中的一个难点,之前一直知道线程有阻塞死锁的状态,但是很抽象,但是真的让我自己写一个死锁的例子,我还真的有点下笔难的感觉,今天看到这本书的第一章,就学习到了一个简单的线程死锁例子,在这里分享出来:
public class DeadLockDemo { private static String A = "A"; private static String B = "B"; public static void main(String[] args){ new DeadLockDemo().deadLock();; } private void deadLock(){ Thread t1=new Thread(new Runnable() { public void run() { synchronized (A) { try { System.out.println("A1"); Thread.currentThread().sleep(2000); } catch (Exception e) { // TODO: handle exception } synchronized (B) { System.out.println("B1"); } } } }); Thread t2=new Thread(new Runnable() { public void run() { synchronized (B) { System.out.println("B2"); synchronized (A) { System.out.println("A2"); } } } }); t1.start(); t2.start(); } }
运行之后可以看到输出结果为:
A1 B2
可以看到输出的结果是A1,B2说明两个线程都开始启动了。并且都进入了一开始的synchronized方法,然后由于方法1锁住了A,方法2锁住了B,导致第二段代码再去获取对方的对象String的锁的时候失败,所以可以看到synchronized的作用,是锁住传入进来的当前对象,传的是什么,就锁什么。如果传的是对象的.class,那么就锁住整个类,也是单例模式的很好的例子。
相关文章推荐
- JAVA__ 上转型和下转型
- 通过java解析域名获得IP地址
- Java NIO使用及原理分析 (四)
- 使用数组实现链表--Java
- Java NIO使用及原理分析(三)
- Pixhawk windows开发环境安装
- Java 面向对象(转)
- Java NIO使用及原理分析(二)
- Java NIO使用及原理分析 (一)
- Java IO流(二)_day21
- 深入理解Java注解处理器
- JavaWeb学习总结(十三)——使用Session防止表单重复提交
- java工具类开发之日期工具类DateUtils和读取属性配置文件工具类PropertiesUtils
- java的21个技术点,你造吗
- Java数据类型小结
- Spring Aop的理解和概念
- SpringMVC接收复杂集合参数
- Java基础知识强化之集合框架笔记80:HashMap的线程不安全性的体现
- Aix下如何运行Java程序
- java泛型