并发编程--死锁

简介: 并发编程--死锁

@[toc]

什么是多线程死锁?

同步中嵌套同步,导致锁无法释放

多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
1、系统资源的竞争

通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。

2、进程推进顺序不合适

进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都会因为所需资源被占用而阻塞。

package com.yxl.demo.ThreadTest;

public class test5 {

    public static void main(String[] args) throws InterruptedException {

        TestDemo thread = new TestDemo();

        Thread t1 = new Thread(thread,"窗口一");
        Thread t2 = new Thread(thread,"窗口二");
        t1.start();
        Thread.sleep(40);
        thread.flag = false;
        t2.start();
    }
}

class TestDemo implements Runnable{
    //共享的火车票变量
    private volatile  int count = 100;

    private  Object object =new Object();

    boolean flag = true;
    //重寫run方法
    @Override
    public void run() {

           if(flag){
               while (count > 0) {
                   synchronized (object) {
                       sale();
                   }
               }
           }else{
               while (count > 0) {

                       sale();

               }
           }


        }



    public synchronized  void sale() {
        try {
            Thread.sleep(50);
        }catch (Exception e){

        }
        synchronized (object) {
            if (count > 0) {
                System.out.println(Thread.currentThread().getName() + "出售 :" + (100 - count + 1));
                count--;
            }
        }
    }

  /*

    public void sale(){
        synchronized (object){
            if(count > 0){
                System.out.println(Thread.currentThread().getName() +"出售 :" +(100 - count + 1));
                count--;
            }
        }
    }*/

}

执行结果:如图所示,红灯一直亮着,锁一直没释放,导致死锁的发生,程序卡住
t1 先获取object锁,在获取this锁,
t2 先获取this锁 ,在获取object锁
在这里插入图片描述

如何解决死锁的发生

  1. 加锁顺序(线程按照一定的顺序加锁)
  2. 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
  3. 死锁检测
相关文章
|
1月前
|
Java
Java并发编程中的死锁问题及解决方法
【2月更文挑战第11天】 在Java并发编程中,死锁是一个常见但又非常棘手的问题。本文将深入探讨死锁的概念、产生原因以及常见的解决方法,帮助读者更好地理解并发编程中的挑战,并提供实用的解决方案。
39 6
|
8天前
|
调度 开发者
探索并发编程中的死锁问题及解决方法
本文将深入探讨并发编程中常见的死锁问题,解释其产生的原因以及对系统造成的影响。同时,将介绍一些常见的死锁解决方法,并提供实际案例进行分析,帮助读者更好地理解并发编程中的死锁现象及应对策略。
|
4月前
|
Java 程序员 调度
多线程之死锁
多线程之死锁
|
4月前
|
Linux C语言
一个简单案例理解为什么在多线程的应用中要使用锁
一个简单案例理解为什么在多线程的应用中要使用锁
17 0
|
5月前
|
算法 安全 Java
死锁的原理
之前在学校学习过程中,很少写多进程的代码,虽然操作系统中学过死锁相关的内容,但考试过后也基本就忘记了,后来自己也遇到过有些多进程死锁的情况,再加上看了有些资料,对死锁才算是有了有些深入的理解。
49 0
|
10月前
|
安全 编译器 C++
C++并发编程中的锁的介绍(二)
C++并发编程中的锁的介绍(二)
123 0
|
10月前
|
算法 安全 C++
C++并发编程中的锁的介绍(一)
C++并发编程中的锁的介绍(一)
130 0
|
10月前
|
缓存 算法 安全
06.一文看懂并发编程中的锁
大家好,我是王有志。相信你经常会听到读锁/写锁,公平锁/非公平锁,乐观锁/悲观锁等五花八门的锁,那么每种锁有什么用呢?它们又有什么区别呢?今天我们就一起聊聊并发编程中的各种锁。
97 1
06.一文看懂并发编程中的锁
|
Java 编译器
Java多线程【锁优化与死锁】
Java多线程【锁优化与死锁】
Java多线程【锁优化与死锁】