线程同步——死锁及举例
2015-09-02 19:31
267 查看
在并发问题中,最严重的一类既是死锁。
死锁是由于多线程在征用多种资源的时候,所需资源被其他线程独占且无法被抢夺所产生的循环等待的现象。
对于java中最常用的synchronized关键字(内置锁),一旦产生死锁,是无法通过程序自身解决的。因为synchronized除了顺利执行完加锁代码块,别无其他方式能够释放锁。因此,希望灵活使用锁的同志们可以考虑使用Lock(见《Java并发编程实战》)。
下面举一个死锁的例子:
死锁是由于多线程在征用多种资源的时候,所需资源被其他线程独占且无法被抢夺所产生的循环等待的现象。
对于java中最常用的synchronized关键字(内置锁),一旦产生死锁,是无法通过程序自身解决的。因为synchronized除了顺利执行完加锁代码块,别无其他方式能够释放锁。因此,希望灵活使用锁的同志们可以考虑使用Lock(见《Java并发编程实战》)。
下面举一个死锁的例子:
//线程1:需要两个String资源a和b。 public class DeadLockThread1 extends Thread{ private String a,b; public DeadLockThread1(String a, String b) { this.a= a; this.b = b; } public void run(){ while(true){ synchronized (a) { System.out.println(Thread.currentThread().getName()+" "+a); synchronized (b) { System.out.println(Thread.currentThread().getName()+" "+b); } } } } } //线程类2:同样需求这两个String资源a和b。 public class DeadLockThread2 extends Thread{ private String a,b; public DeadLockThread2(String a, String b) { this.a= a; this.b = b; } public void run(){ while(true){ synchronized (b) { System.out.println(Thread.currentThread().getName()+" "+b); synchronized (a) { System.out.println(Thread.currentThread().getName()+" "+a); } } } } } //调用类:两个线程同时申请a和b资源,可能导致各自获得一部分资源而陷入循环等待。 public class DeadLockDemo { public static void main(String[] argsStrings){ String a = "a"; String b = "b"; new DeadLockThread2(a, b).start(); new DeadLockThread1(a, b).start(); } }
相关文章推荐
- seajs的那些事儿
- Material Design学习笔记(一)
- HDU 1010 Tempter of the Bone 深搜+奇偶剪枝
- 【window10下python的对elcel表格操作xlrd和xlwt模块的下载与安装及基本的使用】
- select函数的并发限制和 poll 函数应用举例
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )
- 【bzoj3668】【noi 2014】【起床困难综合症】【贪心】
- HDU 5159 Card(DP+组合数啊)
- java并发编程第六章(7)生成并发编程随机数
- [leetcode 19] Remove Nth Node From End of List
- Hadoop FS Shell命令大全
- CF_318_Div.2 Bear and Elections(二分||暴力枚举)
- mybatis-mybatis主配置文件
- 黑马程序员之网络编程
- LeetCode 8_String to Integer (atoi)
- mybatis-动态SQL语句
- U-boot-2014.04移植到MINI2440(9) nor flash启动和nand flash 启动
- 单片机算法FFT
- 常用图片格式
- Topcoder SRM 664 DIV 1