博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java死锁举例
阅读量:5865 次
发布时间:2019-06-19

本文共 1410 字,大约阅读时间需要 4 分钟。

死锁:

    在多线程竞争使用共享资源的情况下。就有可能出现死锁的情况。比方,当一个线程等待还有一个线程所持有的锁时。那个线程又可能在等待第一个线程所持有的锁。此时。这两个线程会陷入无休止的相互等待状态。这样的情况就称为死锁。

产生死锁的四个必要条件:

1、相互排斥条件。

进程对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占有。

2、请求和保持条件。当进程因请求资源而堵塞时,对已获得的资源保持不放。

3、不剥夺条件。

进程已获得的资源,在未使用完之前。不能被剥夺。仅仅能在使用完时由自己释放。

4、环路等待条件。

在发生死锁时,必定存在一个进程-资源的环形链。即进程集合{P1,P2,。。。

,Pn}中的P1等待一个P2占用的资源,P2正在等待一个P3占用的资源。。

。,Pn正在等待已被P1所占用的资源。

比較简单的解决死锁的方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个。来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。可是因为所施加的限制条件往往太严格。可能会导致系统资源利用率和系统吞吐量减少。

以下是产生死锁的一个演示样例:

package com.hh.deadLock;public class DeadLockDemo {	public static void main(String[] args) {		final Object resource1 = "资源1";		final Object resource2 = "资源2";		Thread t1 = new Thread(){			public void run() {				synchronized(resource1){					System.out.println("线程1:获取资源1使用权");					try {						Thread.sleep(500);					} catch (Exception e) {	}					synchronized(resource2){						System.out.println("线程1:等待资源2");					}				}			}		};		Thread t2 = new Thread(){			public void run() {				synchronized(resource2){					System.out.println("线程2:获取资源2使用权");					try {						Thread.sleep(500);					} catch (Exception e) {	}					synchronized(resource1){						System.out.println("线程2:等待资源1");					}				}			}		};				t1.start();		t2.start();	}}
程序会先打印出

线程1:获取资源1使用权线程2:获取资源2使用权
或者是

线程2:获取资源2使用权线程1:获取资源1使用权
然后程序就不再往下运行

线程t1获取“资源1”使用权后等待“资源2”。而线程t2获取“资源2”使用权后等待“资源1”。这样,线程t1和线程t2就引起了死锁。

假设将程序中的Thread.sleep(500);这行代码凝视,则程序可能引起死锁,也可能不引起。

转载地址:http://urjnx.baihongyu.com/

你可能感兴趣的文章
遇到的那些坑
查看>>
央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家
查看>>
[转] Lazy evaluation
查看>>
常用查找算法总结
查看>>
grep 零宽断言
查看>>
被神话的大数据——从大数据(big data)到深度数据(deep data)思维转变
查看>>
修改校准申请遇到的问题
查看>>
【DL-CV】浅谈GoogLeNet(咕咕net)
查看>>
python大佬养成计划----win下对数据库的操作
查看>>
监控软件zabbix之安装
查看>>
Exchange Server 2016 独立部署/共存部署 (七)—— DAG功能测试
查看>>
对RTMP视频流进行BitmapData.draw()出错的解决办法
查看>>
Linux 进程中 Stop, Park, Freeze【转】
查看>>
Spark修炼之道(基础篇)——Linux大数据开发基础:第九节:Shell编程入门(一)...
查看>>
Duplicate Symbol链接错误的原因总结和解决方法[转]
查看>>
适配器模式
查看>>
建立低权限的ftp帐号
查看>>
htpasswd
查看>>
Android窗口机制(三)Window和WindowManager的创建与Activity
查看>>
Android 编译出错解决
查看>>