【Java学习】死锁(22)

本文详细解释了锁的概念,包括同步代码块、同步方法、静态同步方法和Lock接口的使用,以及死锁现象的发生原因和示例。通过具体代码演示了如何在多线程环境下避免死锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是锁

通俗理解就是,将要加锁的代码放到一个房间里,这个房间一次只能有一个人进去,进去的人把锁锁上,在里面操作,不让别人进来,只有当进去的人把锁打开出来后,别的人才能争抢进去.

加锁的方式有:
同步代码块–任意锁对象(多个线程互斥访问,锁对象必须相同)

synchronized (锁对象){
            //包裹你可能出现数据安全问题的代码
        }

同步方法–锁对象为this

public synchronized void test(){
        //包裹你可能出现数据安全问题的代码
    }

静态同步方法–锁对象为类的.class文件

public static synchronized void test(){
        //包裹你可能出现数据安全问题的代码
    }

还有一种加锁的方式是Lock接口

ReentrantLock lock = new ReentrantLock();
lock.lock();//加锁
 //中间写要会出现安全性要加锁的代码
lock.unlock();//释放锁


什么是死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

举例:
例如,现在有公共资源一支笔和一个本子,
现在有两个线程,线程一抢到了笔,线程二抢到了本子,
线程一说,你把本子给我,我就可以把笔给你,
线程二说,你把笔给我,我就把本子给你.
此时线程之间谁也不让谁,互相都不放弃已经拥有的资源
就造成了一种循环等待的情况.就是死锁

举例:
一桌人吃饭,每人旁边只有一支筷子,每次最多只能有一半的人拿起左边筷子和右边的筷子,然后吃饭,如果现在每个人都拿起了自己的一支筷子,则谁也不愿意给别人,就会造成死锁.

死锁现象:
出现在同步代码块相互嵌套,多个线程 互相持有对方的锁,而不释放,造成线程一直处于阻塞状态

死锁问题概述
如果出现了同步嵌套,就容易产生死锁问题
死锁是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象


死锁代码:

线程类:

package com.westos.morning;

public class MyThread extends Thread {
    //死锁
    public static Object obj1=new Object();
    public static Object obj2=new Object();
    Boolean flag;
    public MyThread(Boolean flag) {
        this.flag=flag;
    }

    public MyThread() {

    }

    @Override
    public void run() {
        if (flag) {
            synchronized (obj1) {
                System.out.println("true 进入 obj1");
                try {
                    sleep(10);//为了效果明显,加了点延时
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj2) {
                    System.out.println("true 进入 obj2");
                }
            }
        } else {
            synchronized (obj2) {
                System.out.println("flase 进入 obj2");
                synchronized (obj1) {
                    System.out.println("flase 进入 obj1");
                }
            }
        }


    }}

主类:

package com.westos.morning;

public class Demo2 {
    //死锁

    public static void main(String[] args) {
        MyThread myThread = new MyThread(true);
        MyThread myThread1 = new MyThread(false);
        myThread.start();
        myThread1.start();
    }
}

形成了循环等待
在这里插入图片描述


谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值