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

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

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

  • 1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
  • 2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
  • 3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
  • 4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
package com.thread;import java.util.Date;import java.util.concurrent.TimeUnit;/** *  * @author zy * */public class LockTest {    public static void main(String[] args) {        String o1 = "o1";        String o2 = "o2";        String o3 = "o3";

       new Thread(new LockA(o1, o2), "t1").start();

       new Thread(new LockA(o2, o1), "t2").start();
       //new Thread(new LockA(o2, o3), "t2").start();
       // new Thread(new LockA(o3, o1), "t3").start();

}}class LockA implements Runnable {    private String o1;    private String o2;    public LockA(String o1, String o2) {        this.o1 = o1;        this.o2 = o2;    }    public void run() {        try {            String name = Thread.currentThread().getName();            System.out.println(new Date().toString() + " " + name + "   " + " acquiring lock on " + o1);            synchronized (o1) {                System.out.println(new Date().toString() + " " + name + "   " + " lock on " + o1);                TimeUnit.MILLISECONDS.sleep(300);                System.out.println(new Date().toString() + " " + name + "   " + " acquiring lock on " + o2);                synchronized (o2) {                    System.out.println(new Date().toString() + " " + name + "   " + " lock on " + o2);                    TimeUnit.MILLISECONDS.sleep(300);                }                System.out.println(new Date().toString() + " " + name + " released lock on " + o2);            }            System.out.println(new Date().toString() + " " + name + " released lock on " + o1);            System.out.println(new Date().toString() + " " + name + " finished execution.");        } catch (Exception e) {            e.printStackTrace();        }    }}

运行结果为:

Fri May 05 09:53:55 CST 2017 t2 acquiring lock on o2

Fri May 05 09:53:55 CST 2017 t2 lock on o2
Fri May 05 09:53:55 CST 2017 t1 acquiring lock on o1
Fri May 05 09:53:55 CST 2017 t1 lock on o1
Fri May 05 09:53:55 CST 2017 t1 acquiring lock on o2
Fri May 05 09:53:55 CST 2017 t2 acquiring lock on o1

这是两个线程死锁的时候,也可以让多个线程相互之间关联形成死锁,将注释去掉,再把第二个线程注释掉,就有三个资源相互关联的线程,运行结果:

Fri May 05 10:06:07 CST 2017 t3 acquiring lock on o3

Fri May 05 10:06:07 CST 2017 t3 lock on o3
Fri May 05 10:06:07 CST 2017 t1 acquiring lock on o1
Fri May 05 10:06:07 CST 2017 t1 lock on o1
Fri May 05 10:06:07 CST 2017 t2 acquiring lock on o2
Fri May 05 10:06:07 CST 2017 t2 lock on o2
Fri May 05 10:06:07 CST 2017 t3 acquiring lock on o1
Fri May 05 10:06:07 CST 2017 t2 acquiring lock on o3
Fri May 05 10:06:07 CST 2017 t1 acquiring lock on o2

 

转载于:https://www.cnblogs.com/akaneblog/p/6814341.html

你可能感兴趣的文章
android o logcat read: unexpected EOF!
查看>>
[Scrum]2010/12/28 —— 第一天!
查看>>
ASP.NET MVC模式 温习(一)排除MVC模式误区
查看>>
Mysql的read_only 只读属性说明 (运维笔记)
查看>>
DOCKER 从入门到放弃(五)
查看>>
Python 多线程学习
查看>>
appcan官方ajax
查看>>
获取NVIDIA显卡的温度
查看>>
Dijkstra算法
查看>>
Deep Learning 9: Performance
查看>>
面试题61 把二叉树打印成多行
查看>>
C#例子 易懂故事 接口 委托 事件 异步通知 好玩.
查看>>
[转]Windows Shell 编程 第十一章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987992】...
查看>>
修改presto新版源码让他支持redash数据库
查看>>
Javascript的书写位置
查看>>
树-线索二叉树
查看>>
JAVA遇见HTML——Servlet篇:Servlet基础
查看>>
第二章 Vue快速入门--20 品牌案例-完成品牌列表的添加功能+ 21 品牌案例-根据Id完成品牌的删除...
查看>>
Java单例模式
查看>>
重温WCF之消息契约(MessageContract)(六)
查看>>