记一次 “排它锁" 和 "自旋锁" 的简单实现

谁都会走 提交于 2020-03-27 20:49:35

3 月,跳不动了?>>>

记一次排它锁自旋锁的简单实现

  • 定义一个lock接口

    public interface PutMessageLock {
        void lock();
    
        void unlock();
    }
    
    
  • 排它锁实现

    • 使用java自带的 ReentrantLock即可
    public class PutMessageReentrantLock implements PutMessageLock {
        private ReentrantLock putMessageNormalLock = new ReentrantLock(); // NonfairSync
    
        @Override
        public void lock() {
            putMessageNormalLock.lock();
        }
    
        @Override
        public void unlock() {
            putMessageNormalLock.unlock();
        }
    }
    
    
  • 自旋锁实现

    • 使用 cas + 循环来实现
    public class PutMessageSpinLock implements PutMessageLock {
        //true: Can lock, false : in lock.
        private AtomicBoolean putMessageSpinLock = new AtomicBoolean(true);
    
        @Override
        public void lock() {
            boolean flag;
            do {
                flag = this.putMessageSpinLock.compareAndSet(true, false);
            }
            while (!flag);
        }
    
        @Override
        public void unlock() {
            this.putMessageSpinLock.compareAndSet(false, true);
        }
    }
    
    

----------------------------------------- 广告时间 -----------------------------------------

各位看官,  欢迎关注公众号,每天推送有意思的小东西哦!!!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!