【Java&Go并发编程系列】9.互斥锁——Lock VS sync.Mutex

本文对比分析了Java中的ReentrantLock和Go中的sync.Mutex,探讨了互斥锁在并发编程中确保资源访问同步的作用。通过模拟自动售卖机的场景,展示了如何使用这两种锁防止购物和补货操作并发执行。
摘要由CSDN通过智能技术生成

说明:Java & Go 并发编程序列的文章,根据每篇文章的主题或细分标题,分别演示 Java 和 Go 语言当中的相关实现。更多该系列文章请查看:Java & Go 并发编程系列

互斥锁,用来保证同一时刻只有一个线程进入临界区访问共享资源。在进入临界区之前,需要先获得锁,成功获得锁之后,其他线程因为无法获得锁所以不能进入该临界区。而访问结束之后,需要及时解锁,以便其他线程获取。

以上提到的线程在 Go 语言指 Goroutine​。

以下代码使用了 CountDownLatch 和 sync.WaitGroup,并非本文的重点,关于两者的用法请回顾前文:等待一组并发任务完成——CountDownLatch VS sync.WaitGroup

代码场景:假设有一台自动售卖机,售卖和补货操作不能同一时间进行。即:

  • 当用户在购物时,就不能执行补货操作;
  • 当执行补货操作时,用户也不能购物;
  • 如果有多个用户需要购物,也只能依次执行。

以下代码场景模拟5个用户购物和1个补货员补货的操作。

「Java」ReentrantLock

ReentrantLock为 ​Java 中 Lock 的默认实现,关键方法为 lock()unlock()

// VendingMachine 表示自动售卖机
static class VendingMachine {
   

    // 使用锁来保证,售卖和补货不能同时进行
    private final ReentrantLock lock;

    public VendingMachine() {
   
        this.lock = new ReentrantLock();
    }

    // 售卖
    public void sale() {
   
        lock.lock();// 获得锁之后才能往下执行
        try {
   
            System.out.printf("[%s] 开始购物...\n",
                    Thread.currentThread().getName());
            TimeUnit.MILLISECONDS.sleep(200);
            System.out.printf("[%s] 购物完成.\n",
                    Thread.currentThread().getName());
        } catch (InterruptedException e) {
   
           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值