典型的顺序死锁

简介: 典型的顺序死锁
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();
          }
        });
      } 
   }
}
目录
相关文章
|
8月前
|
Java
面试1: 解决线程顺序有几种方式
面试1: 解决线程顺序有几种方式
|
2月前
|
安全 Java 开发者
Lock锁和AQS之间的关系与区别:基于第一原理的深入分析
【11月更文挑战第26天】在Java并发编程中,锁(Lock)和队列同步器(AbstractQueuedSynchronizer,简称AQS)是两个核心概念。它们为多线程环境下的同步和互斥提供了强大的支持。本文将从第一原理出发,深入探讨Lock锁和AQS之间的关系与区别,同时分析它们的相关概念、业务场景、历史背景、功能点以及底层原理,并使用Java代码进行模拟实现。
29 1
|
3月前
|
存储 安全 Java
JVM锁的膨胀过程与锁内存变化解析
在Java虚拟机(JVM)中,锁机制是确保多线程环境下数据一致性和线程安全的重要手段。随着线程对共享资源的竞争程度不同,JVM中的锁会经历从低级到高级的膨胀过程,以适应不同的并发场景。本文将深入探讨JVM锁的膨胀过程,以及锁在内存中的变化。
59 1
|
6月前
|
机器学习/深度学习 Java 数据挖掘
线程操纵术之更优雅的并行策略问题之并发和并行有区别问题如何解决
线程操纵术之更优雅的并行策略问题之并发和并行有区别问题如何解决
|
7月前
|
Java
探秘死锁:原理、发生条件及解决方案
探秘死锁:原理、发生条件及解决方案
166 1
|
8月前
|
Java
【Java】有 A、B、C 三个线程,如何保证三个线程同时执行?在并发情况下,如何保证三个线程依次执行?如何保证三个线程有序交错执行?
【Java】有 A、B、C 三个线程,如何保证三个线程同时执行?在并发情况下,如何保证三个线程依次执行?如何保证三个线程有序交错执行?
85 0
什么条件下会产出死锁,如何避免死锁?
一个去美团面试的小伙伴私我说,被面试官问到一个死锁的问题难道了,面试前还特意刷了题,面试的时候就是脑子一片空白不知道怎么回答。今天,我给大家彻底讲明白。
103 1
什么条件下会产出死锁,如何避免死锁?
死锁概念
本章讲解什么是死锁以及如何解决
75 0
|
Java 编译器 调度
锁的优化过程
锁的优化过程
三个线程按顺序打印ABC?十二种做法,深入多线程同步通信机制
大家好,我是老三,这篇文章分享一道非常不错的题目:三个线程按序打印ABC。 很多读者朋友应该都觉得这道题目不难,这次给大家带来十二种做法,一定有你没有见过的新姿势。

相关实验场景

更多