• 利用atimicInteger cas的特性实现一个锁


    利用atimicInteger cas的特性实现一个锁

    主要是使用的是 atomicIntegerAPI 的compareAndSet()方法,让线程不在阻塞,获取不到直接失败.

    我们先定义一个异常类

    public class GetLockException extends Exception {
    
    
        public GetLockException() {
            super();
        }
    
        public GetLockException(String message) {
            super(message);
        }
    }

    锁实现类:

    compareAndSet 主要就是对比,前面一个是期望值 后面一个是你要设置的值.

    public class TryLockAtomic {
        private static AtomicInteger value = new AtomicInteger(0);
    
        private Thread lockThread;
    
        public void tryLock() throws GetLockException {
            boolean success = value.compareAndSet(0, 1);
            if(!success){
                throw new GetLockException("get lock failed");
            }
            lockThread = Thread.currentThread();
    
        }
    
    
        public void unlock(){
            if(0 == value.get()){return;}
    
            if(lockThread == Thread.currentThread()){
                value.compareAndSet(1,0);
            }
        }
    }

    测试类

    public static TryLockAtomic tryLockAtomic = new TryLockAtomic();
    
        public static void main(String[] args) {
    
    
            for (int i = 0; i <2 ; i++) {
    
                new Thread(()->{
                    try {
                        dosomething2();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (GetLockException e) {
                        e.printStackTrace();
                    }
    
                }).start();
            }
    
        }
    
        public  static void dosomething() throws InterruptedException {
    
            synchronized (AtomicIntegerTest2.class){
                System.out.println(Thread.currentThread().getName()+"---sleep");
                Thread.sleep(1000000);
            }
    
    
        }
    
        public  static void dosomething2() throws InterruptedException, GetLockException {
    
            try {
    
                tryLockAtomic.tryLock();
                System.out.println(Thread.currentThread().getName()+"---sleep");
                Thread.sleep(1000000);
            } finally {
    //获取不到也会执行unlock 所以在这unlock 里判断是不是获取到锁的那个线程
    tryLockAtomic.unlock(); }
    }
  • 相关阅读:
    微信小程序实现滚动到指定位置
    微信小程序,scroll-view组件的使用,跳转到指定的锚点/定位跳转
    小程序,报渲染层错误。图片无法渲染。
    input Input 输入判断/正则
    js,某元素在浏览器页面浮动/飘动
    前端模块化
    npx create-react-app命令不成功,更改成淘宝镜像
    深入理解jdk和jre(转)
    Java学习路线图·影响一代又一代程序员的经典书籍!(转)
    ZAB协议(转)
  • 原文地址:https://www.cnblogs.com/bj-xiaodao/p/10797016.html
Copyright © 2020-2023  润新知