首页 > java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)

java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)

死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源。

线程死锁产生的条件:

  • 当两个线程相互调用Join()方法。
  • 当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁,互相等待阻塞,就有可能产生死锁

下面看代码:

代码1:死锁的案例

package com.lp.ecjtu.Thread;/*
死锁:常见情景之一:同步的嵌套。*/
class Ticket implements Runnable
{private  int num = 100;Object obj = new Object();boolean flag = true;public void run(){if(flag)while(true){synchronized(obj)//同步代码块里面调用同步函数
                {show();}}elsewhile(true)this.show();}public synchronized void show()//同步函数里面的调用同步代码块
    {synchronized(obj){if(num>0){try{Thread.sleep(10);}catch (InterruptedException e){}System.out.println(Thread.currentThread().getName()+".....sale...."+num--);}}}
}public class DeathLockThread1 
{public static void main(String[] args) {Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);t1.start();try{Thread.sleep(10);}catch(InterruptedException e){}t.flag = false;t2.start();}
}

代码2:

 

package com.lp.ecjtu.Thread;class DeathLockRunable implements Runnable{private boolean flag;public DeathLockRunable(boolean flag){this.flag = flag;}@Overridepublic void run() {if(flag){synchronized (Lock.mylock1){System.out.println("if mylock1"+Thread.currentThread().getName());synchronized (Lock.mylock2){System.out.println("if mylock2"+Thread.currentThread().getName());}}}else{synchronized (Lock.mylock2){System.out.println("else mylock2"+Thread.currentThread().getName());synchronized (Lock.mylock1){System.out.println("else mylock1"+Thread.currentThread().getName());}}}}}class Lock{static Object mylock1 = new Object();static Object mylock2 = new Object();}public class DeathLockThread{public static void main(String[] args){Thread t1 = new Thread(new DeathLockRunable(true));Thread t2 = new Thread(new DeathLockRunable(false));t1.start();t2.start();}}

输出结果:if mylock1Thread-0

else mylock2Thread-1





 

更多相关:

  • 菜鸟一枚,正在学习C++ Gui Qt4,整理很零碎,欢迎批评指正   1.窗口标题: QWidget *window = new QWidget; window->setWindowTitle("Enter Your Age"); **************************************** 关于标题...

  • 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 总体思路是: 比较两个链表头节点,较小的插入新链表指针之后,同时较小链表指针向后移动一位 实现如下: ListNode* mergeTwo...

  • 1.直接调用微软socket对象处理 static void Main(string[] args){try{IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });//在3721端口新建一个TcpListener对象TcpListener listener = new...

  •   现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式。用到的场景就是服务注册,比如一个集群服务器,需要知道哪些服务器在线,哪些服务器不在线。   ZK有一个功能,就是创建临时节点,当机器启动应用的时候就会连接到一个ZK节点,然后创建一个临时节点,那么通过获取监听该路径,并且获取该路径下的节点数量就知道有哪些服务...

  • 前台到后台java时data日期类型的转化 在实体类中用@DataTimeFormat,这样设置即使传过来是空的字符串也是可以转的,要和前面传过来的格式一致,如 @XmlElement(name="BeginDate") @DateTimeFormat(pattern="yyyy-MM-dd") private Date begin...