欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义同步组件——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);
        }
}
相关标签: java 共享锁