java自定义实现lock

2020-11-22  本文已影响0人  风一样的存在

自己看着讲解的视频,敲了一边代码。

public class MyLock {
    private Sync sync;

    class Sync extends AbstractQueuedSynchronizer{
        @Override
        protected boolean tryAcquire(int acquires) {
            //当前线程
            final Thread current = Thread.currentThread();
            int c = getState();
            /**
             * 0:当前锁是空闲
             * 1:有锁
             */
            if(c == 0){
                if(compareAndSetState(0,acquires)){
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }else if(current == getExclusiveOwnerThread()){
                int next = c + acquires;
                setState(next);
                return true;
            }
            return false;
        }

        @Override
        protected boolean tryRelease(int releases) {
            int c = getState() - releases;
            if(Thread.currentThread() != getExclusiveOwnerThread()){
                throw new IllegalMonitorStateException();
            }
            boolean free = false;
            if (c == 0){
                free = true;
                setExclusiveOwnerThread(null);
            }
            setState(c);
            return free;
        }

        /**
         * 显示当前持有锁的线程
         */
        public void showExclusiveThread(){
            if (getExclusiveOwnerThread() != null) {
                System.out.println("currentThread is "+getExclusiveOwnerThread().getName());
            }
        }
    }

    public MyLock(){
        sync = new Sync();
    }

    public void lock(){
        sync.acquire(1);
    }

    public void unLock(){
        sync.release(1);
    }

    public void showLockThread(){
        sync.showExclusiveThread();
    }

    public static void main(String[] args) throws InterruptedException {
        final MyLock lock = new MyLock();

        Thread t1 = new Thread(()->{
            try{
                System.out.println("t1 start................");
                lock.lock();
                System.out.println("t1 get lock................");
                Thread.sleep(5000);
                System.out.println("t1 return................");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unLock();
            }
        });
        t1.setName("t1");

        Thread t2 = new Thread(()->{
            try{
                System.out.println("t2 start................");
                lock.lock();
                System.out.println("t2 get lock................");
                Thread.sleep(5000);
                System.out.println("t2 return...............");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unLock();
            }
        });
        t2.setName("t2");

        t1.start();
        t2.start();

        Thread.sleep(2000);
        lock.showLockThread();
    }
}

对应的视频链接: Java并发锁框架AQS(AbstractQueuedSynchronizer)原理从理论到源码透彻解析

上一篇 下一篇

猜你喜欢

热点阅读