java并发编程之类Semaphore常用方法

Semaphore类的主要作用是限制线程并发的数量,如果不限制线程并发的数量,CPU的资源将会面临耗尽的局面,每个线程执行任务将会相当缓慢。因为CPU要将时间片分配给不同的线程对象,而且上下文切换也要耗时,最终导致系统运行效率大幅降低。


1.1 类Semaphore构造方法

方法:Semaphore(int permits)

作用:新建一个Semaphore对象。

参数:permits,作用是初始化设置许可的数量。即最多允许permits个线程执行acquire()与release()之间的代码。当permits大于1时,则该类并不能保证线程的安全性,因为还是有可能会导致多个线程共同访问实例变量,导致出现脏数据的情况。

方法:Semaphore(int permits,  boolean fair)

参数:fair,表明创建的Semaphore对象是公平信号量(fair为true)还是非公平信号量(fair为false)。所谓公平信号量表明获得锁的顺序与线程启动的顺序相关,但不代表100%的获得信号量,仅仅是在概率上能够获得保证。而非公平信号量就是无关的了。


1.2 方法acquire(int permits)参数作用及动态添加许可

方法:acquire(int permits)

作用:每次调用一次该方法,则消耗permits个许可。

方法:acquire()

作用:每次调用一次该方法,则消耗一个许可。

方法:release()

作用:每次调用一次该方法,相当于许可加1。

方法:release(int permits)

作用:每次调用一次该方法,相当于加上permits个许可。

release()与release(int permits),当多次调用时,相当于动态增加许可总个数。在实际开发中,acquire()与release()成对出现,以保证每个线程用时消耗,用完释放。最后实现限制线程最大并发数。


1.3  acquireUninterruptibly()

方法:acquireUninterruptibly()

作用:使得等待进入acquile()方法的线程,不允许被中断。

方法:acquireUninterruptibly(int permits)

作用:此方法的作用是,等待许可的条件下不允许中断,且获得锁后,将消耗permits个许可。


1.4 availablePermits()和drainPermits()

方法:availablePermits()

作用:返回此Semaphore对象当前可用的许可数,此方法通常用于调试,因为许可的数量有可能实时在改变,并不是固定的数量。

方法:drainPermits()

作用:返回此Semaphore对象当前可用的许可数,并将可用许可清零。


1.5  getQueueLength()和hasQueuedThread()

方法:getQueueLength()

作用:取得此Semaphore对象等待许可的线程个数。

方法:hasQueuedThread()

作用:判断此Semaphore对象是否还有等待许可的线程。


1.6  方法:tryAcquire()

作用:无参方法tryAcquire()作用是尝试获取一个许可,如果获取不到返回false,通常与if语句结合,其具有无阻塞特点。无阻塞特点是,不至于将线程在同步处一直等待状态,如果if判断不成立,则线程会继续走else语句,程序会继续向下运行。

方法:tryAcquire(int permits)

左右:尝试获取permits个许可,如果获取不到则返回false。

方法:tryAcquire(long timeOut,  TimerUnit unit)

作用:在指定的时间内尝试获取一个许可,如果获取不到返回false。

方法:tryAcquire(int permits, long timeOut, TimerUnit unit)

作用:在指定的时间内尝试获取permits个许可,如果获取不到返回false。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值