java产生死锁的简单例子

复制代码
复制代码
class Test implements Runnable
{
    private boolean flag;
    Test(boolean flag)
    {
        this.flag=flag;
    }

    public void run()
    {
        if (flag)//如果flag为ture,运行a,如果flag为false,运行B
        {
            while (true)
            {
            
            synchronized(MyLock.locka)
            {
                System.out.println("if locka");
                synchronized(MyLock.lockb)
                {
                    System.out.println("if lockb");
                }
            }
            }
        }
        else
        {
            while (true)
            {
            
            synchronized(MyLock.lockb)
            {
                System.out.println("else lockb");
                synchronized(MyLock.locka)
                {
                    System.out.println("else locka");
                }
            }
            }
        }
        
    }



    
}
class MyLock
{
    public static final Object locka=new Object();
    public static final Object lockb=new Object();
}

class deadLockTest
{
    public static void main(String[] args)
    {
        Test a=new Test(true);
        Test b=new Test(false);

        Thread t1=new Thread(a);
        Thread t2=new Thread(b);

        t1.start();
        t2.start();
    }
}
复制代码

 

复制代码

运行结果如下,可以看到当只有第一个线程运行时,不会产生死锁问题,当t1线程完成第一个同步,获取到locka锁,CPU扫到t2线程,t2获取到lockb锁。这时,无论CPU扫到哪个线程,都无法进行下一个同步,因为t1和t2都无法获取下一个同步所需要的锁。

 

posted on   yfyfyf947  阅读(164)  评论(0)    收藏  举报

编辑推荐:
· 智能桌面机器人:使用 .NET 为树莓派开发 Wifi 配网功能
· C# 模式匹配全解:原理、用法与易错点
· 记一次SSD性能瓶颈排查之路——寿命与性能之间的取舍
· 理解 .NET 结构体字段的内存布局
· .NET 9中的异常处理性能提升分析:为什么过去慢,未来快
阅读排行:
· C# 模式匹配全解:原理、用法与易错点
· 杂七杂八系列----C#代码如何影响CPU缓存速度?
· C#/.NET/.NET Core优秀项目和框架2025年5月简报
· 鸿蒙仓颉语言开发实战教程:商城应用个人中心页面
· FFmpeg开发笔记(六十三)FFmpeg使用vvenc把视频转为H.266编码
< 2025年6月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12

统计

点击右上角即可分享
微信分享提示