JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java核心知识 多线程并发 Semaphore信号量 (十一)

wys521 2024-11-06 20:35:06 精选教程 31 ℃ 0 评论


Semaphore 是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信 号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore 可以用来 构建一些对象池,资源池之类的,比如数据库连接池

实现互斥锁(计数器为 1)

我们也可以创建计数为 1 的 Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量, 表示两种互斥状态。

代码实现

它的用法如下:


Semaphore 与 ReentrantLock

Semaphore 基本能完成 ReentrantLock 的所有工作,使用方法也与之类似,通过 acquire()与 release()方法来获得和释放临界资源。经实测,Semaphone.acquire()方法默认为可响应中断锁, 与 ReentrantLock.lockInterruptibly()作用效果一致,也就是说在等待临界资源的过程中可以被 Thread.interrupt()方法中断。

此外,Semaphore 也实现了可轮询的锁请求与定时锁的功能,除了方法名 tryAcquire 与 tryLock 不同,其使用方法与 ReentrantLock 几乎一致。Semaphore 也提供了公平与非公平锁的机制,也 可在构造函数中进行设定。

Semaphore 的锁释放操作也由手动进行,因此与 ReentrantLock 一样,为避免线程因抛出异常而 无法正常释放锁的情况发生,释放锁的操作也必须在 finally 代码块中完成。

AtomicInteger

首 先 说 明 , 此 处 AtomicInteger , 一 个 提 供 原 子 操 作 的 Integer 的类, 常 见 的 还 有 AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference 等,他们的实现原理相同, 区别在与运算对象类型的不同。令人兴奋地,还可以通过 AtomicReference<V>将一个对象的所 有操作转化成原子操作。

我们知道,在多线程程序中,诸如++i 或 i++等运算不具有原子性,是不安全的线程操作之一。 通常我们会使用 synchronized 将该操作变成一个原子操作,但 JVM 为此类操作特意提供了一些 同步类,使得使用更方便,且使程序运行效率变得更高。通过相关资料显示,通常 AtomicInteger 的性能是 ReentantLock 的好几倍。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表