首页 > 其他分享 >死锁

死锁

时间:2024-04-17 21:00:23浏览次数:19  
标签:name synchronized Makeup System choice 死锁 out

多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致俩个或者多个线程都在等待对方释放资源。

package syn;

public class DeadLock {
    public static void main(String[] args) {
        Makeup s1 = new Makeup(0,"小明");
        Makeup s2 = new Makeup(1,"小红");
        s1.start();
        s2.start();
    }
}
class Lipstick {

}
class Mirror {

}
class Makeup extends Thread{
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();
    int choice;
    String name;
    Makeup(int choice, String name){
        this.choice = choice;
        this.name = name;
    }
    @Override
    public void run() {
        try {
            makeup();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    private void makeup() throws InterruptedException {
        if(choice == 0){
            synchronized (lipstick){
                System.out.println(this.name+"拿到了口红的锁");
                Thread.sleep(1000);
                synchronized (mirror){
                    System.out.println(this.name+"拿到了镜子的锁");
                }
            }
        }else {
            synchronized (mirror){
                System.out.println(this.name+"拿到了镜子的锁");
                Thread.sleep(2000);
                synchronized (lipstick){
                    System.out.println(this.name+"拿到了口红的锁");
                }
            }
        }
    }
}

image
只要将一把锁改为俩把锁就可以释放资源

package syn;

public class DeadLock {
    public static void main(String[] args) {
        Makeup s1 = new Makeup(0,"小明");
        Makeup s2 = new Makeup(1,"小红");
        s1.start();
        s2.start();
    }
}
class Lipstick {

}
class Mirror {

}
class Makeup extends Thread{
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();
    int choice;
    String name;
    Makeup(int choice, String name){
        this.choice = choice;
        this.name = name;
    }
    @Override
    public void run() {
        try {
            makeup();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    private void makeup() throws InterruptedException {
        if(choice == 0){
            synchronized (lipstick){
                System.out.println(this.name+"拿到了口红的锁");
                Thread.sleep(1000);

                }
                synchronized (mirror){
                System.out.println(this.name+"拿到了镜子的锁");
            }

        }else {
            synchronized (mirror){
                System.out.println(this.name+"拿到了镜子的锁");
                Thread.sleep(2000);

            }
            synchronized (lipstick){
                System.out.println(this.name+"拿到了口红的锁");
        }
        }
    }
}

image

标签:name,synchronized,Makeup,System,choice,死锁,out
From: https://www.cnblogs.com/gang-pao/p/18141771

相关文章

  • 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁
    前言:作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用。此时,你需要尽快侦测和处理这类问题。死锁是当两个或者以上的事务互相阻塞引起的。在这种情况下两个事务会无限期地等待对方释放资源以便操作。下面是死锁的示意图: 本文将使用SQLServerProfi......
  • 死锁指南
    死锁指南项目2023/10/263个参与者反馈 本文内容了解死锁检测和结束死锁死锁检测死锁信息工具显示另外5个适用于:SQLServerAzureSQL数据库AzureSQL托管实例AzureSynapseAnalyticsAnalyticsPlatformSystem(PDW)本文深入讨论SQLServer数据库引擎......
  • 模拟SQLserver死锁现象
    模拟SQLserver死锁现象 SQLServer死锁是指两个或多个事务相互等待对方持有的资源而无法继续执行的情况。当两个或多个事务都持有一些资源并且试图获取其他事务持有的资源时,可能会发生死锁。这种情况下,每个事务都在等待另一个事务释放其所需的资源,导致所有涉及的事务都无法继......
  • 使用 SQL SERVER PROFILER 监测死锁
    作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用。此时,你需要尽快侦测和处理这类问题。死锁是当两个或者以上的事务互相阻塞引起的。在这种情况下两个事务会无限期地等待对方释放资源以便操作。下面是死锁的示意图: 本文将使用SQLServerProfile......
  • 模拟SQLserver死锁现象(解析)
    SQLServer死锁是指两个或多个事务相互等待对方持有的资源而无法继续执行的情况。当两个或多个事务都持有一些资源并且试图获取其他事务持有的资源时,可能会发生死锁。这种情况下,每个事务都在等待另一个事务释放其所需的资源,导致所有涉及的事务都无法继续执行,形成了死锁。死锁通常......
  • 死锁和递归锁
    死锁和递归锁一、死锁[1]关于死锁死锁是指两个或多个进程,在执行过程中,因争夺资源而造成了互相等待的一种现象。即两个或多个进程持有各自的锁并试图获取对方持有的锁,从而导致被阻塞,不能向前执行,最终形成僵局。在这种情况下,系统资源利用率极低,系统处于一种死循环状态。[2]......
  • 模拟SQLserver死锁现象
    SQLServer死锁是指两个或多个事务相互等待对方持有的资源而无法继续执行的情况。当两个或多个事务都持有一些资源并且试图获取其他事务持有的资源时,可能会发生死锁。这种情况下,每个事务都在等待另一个事务释放其所需的资源,导致所有涉及的事务都无法继续执行,形成了死锁。死锁通常......
  • sql server在高并发状态下同时执行Select查询与Update更新操作时的死锁问题
    最近在项目上线使用过程中使用SqlServer的时候发现在高并发情况下,频繁更新和频繁查询引发死锁。通常我们知道如果两个事务同时对一个表进行插入或修改数据,会发生在请求对表的X锁时,已经被对方持有了。由于得不到锁,后面的Commit无法执行,这样双方开始死锁。但是select语句和upda......
  • 达梦执行存储过程报死锁问题分析排查方法
    最近在一个项目中调用存储过程报死锁错误,而根据DEADLOCK_HISTORY也无法看出是哪个表产生了死锁,下面模拟一下环境做测试dropTABLEifEXISTStest;CREATETABLEtest(idint);BEGINforiin1..100loopinsertintotestVALUES(i);endloop;commit;end;CREATEorREP......
  • 进程调度-死锁-存储管理-固定分页分段
    进程调度进程调度方式是指当有更高优先级的进程到来时如何分配CPU。分为可剥夺和不可剥夺两种,可剥夺指当有更高优先级进程到来时,强行将正在运行进程的CPU分配给高优先级进程;不可剥夺是指高优先级进程必须等待当前进程自动释放CPU。在某些操作系统中,一个作业从提交到完成需要经......