zoukankan      html  css  js  c++  java
  • 利用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(); }
    }
  • 相关阅读:
    Scrum学习总结
    1330. 翻转子数组得到最大的数组值
    LeetCode 中等题解(4)
    LeetCode 中等题解(3)
    LeetCode 中等题解(2)
    LeetCode 中等题解(1)
    【暑期实习】计算机视觉岗问题整理-腾讯
    【暑期实习】计算机视觉岗问题整理-快手
    【暑期实习】计算机视觉岗问题整理-阿里
    Leetcode 1329. 将矩阵按对角线排序 题解
  • 原文地址:https://www.cnblogs.com/bj-xiaodao/p/10797016.html
Copyright © 2011-2022 走看看