java semaphore 源码_Semaphore底层源码实现原理解析

本文深入探讨了Java中的Semaphore类,通过示例代码展示了其在控制并发数上的应用,并详细解析了Semaphore的源码,包括acquire()和release()方法的工作原理,涉及线程同步、CAS操作和等待队列的管理。
摘要由CSDN通过智能技术生成

一、SemaphoreDemo

Semaphore的应用场景就是加锁、异步、控制并发数

下面demo可以理解为抢夺共享资源

import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String[] args) { String[] name = {"小胖", "大花", "大肥", "小桌子", "小椅子"}; Semaphore semaphore = new Semaphore(3); for (int i = 0; i < 5; i++) { //五个人去争夺三个共享资源 //五个人一放学就去网吧抢机子,网吧只有三台电脑 new Thread(new Runnable() { @Override public void run() { try { System.out.println(Thread.currentThread().getName() + "进入网吧"); semaphore.acquire(); System.out.println(Thread.currentThread().getName() + "抢到了电脑"); Thread.sleep(5000); System.out.println(Thread.currentThread().getName() + "下机了"); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } } }, name[i]).start(); } } }

运行结果

抢不到电脑的要等别人下机之后才能上网

5e63f7d4f7b97e95fad31e412b8bec17.png

二、加锁

在调用semaphore.acquire()方法后,进入InterruptedException(),然后点击进入tryAcquireShared()

public final void acquireSharedInterruptibly(int arg) throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值