典型的顺序死锁

简介: 典型的顺序死锁
package com.thread.deadlock;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 死锁的出现分2中情况:
 * 1.锁顺序死锁
 * 2.资源死锁
 * 资源死锁的典型例子是:线程饥饿死锁和数据库连接池的饥饿死锁
 * 
 * 本例演示的是锁顺序死锁
 * 当一个线程永远占用一个锁,而其他线程尝试去获得这个锁,那么它们将永远被阻塞。
 * 当线程A占用锁L时,想要获得锁M,但是同时,线程B持有锁M,并尝试获得L,两个线程将永远等待下去。
 * 这种情况是死锁最简单的形式(或称致命的拥抱)。
 * 发生在多个线程因为环路的锁依赖关系而永远等待的情况下。
 * 
 * 
 * 怎么避免出现锁顺序死锁?
 * 如果所有线程以通用的固定秩序获得锁,程序就不会出现锁顺序死锁的问题了。
 * 
 * @author hadoop
 *
 */
public class LeftRightDeadlock {
   private final Object left = new Object();
   private final Object right = new Object();
   public void leftToRight(){
       synchronized(left){
            synchronized(right){
              try {
              Thread.currentThread().sleep(20);//延迟执行时间,提高死锁概率
            } catch (InterruptedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
            }
               System.out.println(Thread.currentThread().getName() + "执行从左到右顺序的操作");
            }
       }
   }
   public void  RightToLeft(){
     synchronized(right){
        synchronized(left){
          try {
        Thread.currentThread().sleep(30);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
           System.out.println(Thread.currentThread().getName() +"执行从右到左顺序的操作");
        }
    }
   }
   public static void main(String[] args) {
         ExecutorService mExecutor = Executors.newCachedThreadPool();
         final LeftRightDeadlock lrlock = new LeftRightDeadlock();
         for (int i = 0; i < 1000; i++) {
           mExecutor.execute(new Runnable() {
          @Override
          public void run() {
            lrlock.RightToLeft();
          }
        });
      }
         for (int i = 0; i < 1000; i++) {
           mExecutor.execute(new Runnable() {
          @Override
          public void run() {
            lrlock.leftToRight();
          }
        });
      } 
   }
}
目录
相关文章
|
7月前
|
存储 前端开发 Java
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
202 1
|
7月前
|
Java
面试1: 解决线程顺序有几种方式
面试1: 解决线程顺序有几种方式
|
8天前
|
安全 Java 开发者
Lock锁和AQS之间的关系与区别:基于第一原理的深入分析
【11月更文挑战第26天】在Java并发编程中,锁(Lock)和队列同步器(AbstractQueuedSynchronizer,简称AQS)是两个核心概念。它们为多线程环境下的同步和互斥提供了强大的支持。本文将从第一原理出发,深入探讨Lock锁和AQS之间的关系与区别,同时分析它们的相关概念、业务场景、历史背景、功能点以及底层原理,并使用Java代码进行模拟实现。
15 1
|
5月前
|
机器学习/深度学习 Java 数据挖掘
线程操纵术之更优雅的并行策略问题之并发和并行有区别问题如何解决
线程操纵术之更优雅的并行策略问题之并发和并行有区别问题如何解决
|
5月前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
51 0
|
6月前
|
Python
Python多线程中递归锁如何解决死锁问题的详细阐述
Python多线程中递归锁如何解决死锁问题的详细阐述
|
7月前
|
Java
【Java】有 A、B、C 三个线程,如何保证三个线程同时执行?在并发情况下,如何保证三个线程依次执行?如何保证三个线程有序交错执行?
【Java】有 A、B、C 三个线程,如何保证三个线程同时执行?在并发情况下,如何保证三个线程依次执行?如何保证三个线程有序交错执行?
79 0
什么条件下会产出死锁,如何避免死锁?
一个去美团面试的小伙伴私我说,被面试官问到一个死锁的问题难道了,面试前还特意刷了题,面试的时候就是脑子一片空白不知道怎么回答。今天,我给大家彻底讲明白。
96 1
什么条件下会产出死锁,如何避免死锁?
|
Java 编译器 调度
锁的优化过程
锁的优化过程
三个线程按顺序打印ABC?十二种做法,深入多线程同步通信机制
大家好,我是老三,这篇文章分享一道非常不错的题目:三个线程按序打印ABC。 很多读者朋友应该都觉得这道题目不难,这次给大家带来十二种做法,一定有你没有见过的新姿势。