自定义同步组件——TwinsLock
程序员文章站
2022-06-04 11:32:48
...
设计一个同步工具,该工具同一个时刻,只允许两个线程同时访问,超过两个线程访问将会被阻塞。
分析:首先,确定访问模式,TwinLock能够同一时刻支持多个线程同时访问,这明显是共享式访问。这需要同步器提供的acquireShared(int args)方法和Share相关的方法,同时要求重写tryAcquireShared(int args)等方法。
其次,定义资源数量,TwinsLock在同一时刻允许两个线程同时访问资源数量为0,这样设置初始状态status为2,合法状态0、1、2.
TwinLock.java
public class TwinsLock implements Lock{
private final Sync sync = new Sync(2);
private static final class Sync extends AbstractQueuedSynchronizer{
Sync(int count){
if(count<=0){...throw new IllengalArgumentException("");}
setSate(count);
}
public int tryAcquireShared(int reduceCount){
for(;;){
int current =getState();
int newCount =current-reduceCount;
if(newCount<0||compareAndSetSate(current,nowCount)){
return newCount;
}
}
}
public boolean tryRelaseShared(int returnCount){
for(;;){
int current = getState();
int newState = current+returnCount;
if(compareAndSetState(courrent,newCount)){
return true;
}
}
}
public void lock(){
sync.acquireShare(1);
}
public void unlock(){
sync.releaseShared(1);
}
}
上一篇: sql多表多行加读锁(共享锁)
下一篇: Oracle锁机制深度分析