本文介绍 hazelcast 中 ISemaphore 的使用。
ISemaphore 的基础使用
首先放上基础代码
示例代码
代码主要包含两部分:
ISemaphore 与 jdk 中的 Semaphore 功能一样,限制线程或者方法对同一资源的访问数量。每次在获取共享资源之前,先获取授权。
与锁不同的是 semaphore 可以有多个授权,并且线程可以主动释放资源。
如果可以获得授权,那么就可以访问资源了,如果不能获得,则等待其他线程的授权释放。
通过第一部分,我们可以看到对 ISemaphore 的配置。可以配置对应semaphore的名字,同步备份个数,初始大小,还有脑裂判断quorum的依赖名称。
hazelcast 提供了对 ISemaphore 的备份,如果一个成员 down 掉,其他成员可以接管 semaphore 和对应授权信息,注意如果 semaphore 所在的成员 down
掉,那么对应的授权都会释放。为了保证 semaphore 的高可用,可以设置对应的参数:
- backup-count 同步备份个数
- async-backup-count 异步备份个数
默认 hazelcast 对同步备份是启用的,默认备份1个。
第二部分是一个多线程同时对 IAtomicLong 进行加,睡一秒后进行减。运行可以观察到始终不会超过2。因为最多只有三个线程可以操作 IAtomicLong,虽然有五个线程在执行。
脑裂保护
脑裂保护可以分为写、读写、读三类操作的保护。
ISemaphore 的脑裂情况可以采取下面这个配置项进行避免。
配置项 | 含义 | 备注 |
---|---|---|
quorum-ref | ISemaphore | |
通过上面的两个代码例子,希望能够对 hazelcast 中的 ISemaphore 有一定的认识。 |