java锁:第二章:可重入锁和递归锁

可重入锁解析
本文深入探讨了可重入锁的概念及其在Java并发编程中的应用。通过具体代码示例,展示了如何使用ReentrantLock实现线程安全的方法调用,避免死锁现象。同时,文章还提供了生动的生活案例帮助理解可重入锁的工作原理。

可重入锁是什么?

可以防止死锁,是同一把锁

代码:

package com.javaliao.backstage;

class Phone{

    public synchronized void sendSMS(){
        System.out.println(Thread.currentThread().getName()+"\t 发短信");
        sendEmail();
    }
    public synchronized void sendEmail(){
        System.out.println(Thread.currentThread().getName()+"\t 发邮件");
    }
}
public class Demo {
    public static void main(String[] args) {
        Phone phone = new Phone();
        new Thread(()->{
            phone.sendSMS();
        },"t1").start();
        new Thread(()->{
            phone.sendSMS();
        },"t2").start();
    }
}

控制台:

生活案例:

家里的大门有一把锁,厕所没有上锁。我进了大门了,就不用在厕所上锁了。

ReentrantLock就是把可重入锁

package com.javaliao.backstage;


import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Phone implements Runnable{

    Lock lock = new ReentrantLock();
    @Override
    public void run() {
        sendSMS();
    }

    public void sendSMS(){
        //加几把就要解锁几次
        lock.lock();
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"\t 发短信");
            sendEmail();
        } finally {
            lock.unlock();
            lock.unlock();
        }
    }
    public void sendEmail(){
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"\t 发邮件");
        } finally {
            lock.unlock();
        }
    }


}
public class Demo {
    public static void main(String[] args) {
        Phone phone = new Phone();
        Thread t1 = new Thread(phone,"t1");
        Thread t2 = new Thread(phone,"t2");
        t1.start();
        t2.start();
    }
}

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序员廖志伟

赏我包辣条呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值