死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,他们都无法推进下去。通俗一点就是两个进程都持有资源,但是又想抢对方的资源,互不相让了。
成都创新互联公司成立以来不断整合自身及行业资源、不断突破观念以使企业策略得到完善和成熟,建立了一套“以技术为基点,以客户需求中心、市场为导向”的快速反应体系。对公司的主营项目,如中高端企业网站企划 / 设计、行业 / 企业门户设计推广、行业门户平台运营、app软件定制开发、移动网站建设、微信网站制作、软件开发、绵阳服务器托管等实行标准化操作,让客户可以直观的预知到从成都创新互联公司可以获得的服务效果。
图片
死锁的问题和其他的并发安全问题一样,是概率性的,也就是说,即使存在发生死锁的可能性,也并不是 100% 会发生的。如果每个锁的持有时间很短,那么发生冲突的概率就很低,所以死锁发生的概率也很低。可能每天有几千万次的“获取锁”、“释放锁”操作,在巨量的次数面前,整个系统发生问题的几率就会被放大。
public static void main(String[] args) {
//2个对象2把锁
//创建2个线程,首先获取自己的对象锁,确保获取了锁,然后去获取对方的锁
final Object o1 = new Object();
final Object o2 = new Object();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (o1) {
System.out.println("thread1获取了o1对象的锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1等待o2锁释放...");
synchronized (o2) {
System.out.println("thread1获取了o2对象的锁");
}
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (o2) {
System.out.println("thread2获取了o2对象的锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2等待o1锁释放...");
synchronized (o1) {
System.out.println("thread2获取了o1对象的锁");
}
}
}
});
thread1.start();
thread2.start();
}
运行结果:
thread1获取了o1对象的锁
thread2获取了o2对象的锁
thread2等待o1锁释放...
thread1等待o2锁释放...
可见线程一先上了o1锁,线程二先上了o2锁,然后线程一需要等待线程二的o2锁释放获取到该锁执行完后续代码才能释放o1锁,但线程二也需要等待线程一的o1锁释放获取到该锁执行完后续代码才能释放o2锁。他俩就互相等待,锁死了。
加锁顺序(线程按照一定的顺序加锁,规定获取资源需要按照一定顺序)
加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁;第二,可以用Lock中tryLock,尝试拿锁,拿不到不会持续等待)
死锁检测
标题名称:Java死锁,你学会了吗?
分享URL:http://www.gawzjz.com/qtweb/news11/194961.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联