怎么在Java中实现线程死锁

  介绍

本篇文章为大家展示了怎么在Java中实现线程死锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1、死锁的定义

所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进

2,死锁产生的必要条件

互斥条件:线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有线程请求该资源,则请求线程只能等待。

不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程倾向夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。

请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该线程已被其他线程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。即存在一个处于等待状态的线程集合{P1, P2,…, Pn},其中π等待的资源被p (i + 1)占有(i=0,1,…, n - 1), Pn等待的资源被P0占有,如下图。

怎么在Java中实现线程死锁

3,产生死锁的一个例子

/* *   ,*一个简单的死锁类   *大敌;当死锁类的对象标志==1时(td1),先锁定o1,睡眠500 ms   *大敌;而td1在睡眠的时候另一个标志==0的对象(td2)线程启动,先锁定o2,睡眠500 ms   ,* td1 睡眠结束后需要锁定,o2 才能继续执行,而此时,o2 已被,td2 锁定;   ,* td2 睡眠结束后需要锁定,o1 才能继续执行,而此时,o1 已被,td1 锁定;   ,* td1 td2 相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。   ,*/public  class  DeadLock  implements  Runnable  {   public 才能int  flag =, 1;//才能静态对象是类的所有对象共享的   private 才能static  Object  o1 =, new 对象(),,o2 =, new 对象();      @Override才能   public 才能;void 运行(),{   ,,,System.out.println(“国旗”=?标志);   ,,,如果(标志==1){   ,,,,,synchronized  (o1) {   ,,,,,,,try  {   ,,,,,,,,,thread . sleep (500);   ,,,,,,,},catch  (InterruptedException  e), {   ,,,,,,,,,e.printStackTrace ();   ,,,,,,,}   ,,,,,,,synchronized  (o2) {   ,,,,,,,,,System.out.println (“1“);   ,,,,,,,}   ,,,,,}   ,,,}   ,,,如果(标志==0){   ,,,,,synchronized  (o2) {   ,,,,,,,try  {   ,,,,,,,,,thread . sleep (500);   ,,,,,,,},catch  (InterruptedException  e), {   ,,,,,,,,,e.printStackTrace ();   ,,,,,,,}   ,,,,,,,synchronized  (o1) {   ,,,,,,,,,System.out.println (“0”);   ,,,,,,,}   ,,,,,}   ,,,}   ,,}   public 才能;static  void  main (String [], args), {   ,,,DeadLock  td1 =, new 死锁();   ,,,DeadLock  td2 =, new 死锁();   ,,,td1.flag=1;   ,,,td2.flag=0;   ,,,//td1、td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。   ,,,//td2的运行()可能在td1的运行()之前运行   ,,,new 线程(td1) .start ();   ,,,new 线程(td2) .start ();   ,,}   }

怎么在Java中实现线程死锁

4,如何避免死锁

在有些情况下死锁是可以避免的。两种用于避免死锁的技术

1)加锁顺序(线程按照一定的顺序加锁

怎么在Java中实现线程死锁

2)加锁时限(线程获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)

怎么在Java中实现线程死锁

常用的Java框架有哪些

1。SpringMVC, Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级网络框架。2。Shiro, Apache Shiro是Java的一个安全框架。3。Mybatis, Mybatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.4.Dubbo,达博是一个分布式服务框架.5.Maven, Maven是个项目管理和构建自动化工具.6.RabbitMQ, RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器1:8)。Ehcache, Ehcache是一个纯Java的进程内缓存框架。

怎么在Java中实现线程死锁