利用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(); }
}
原文地址:https://www.cnblogs.com/bj-xiaodao/p/10797016.html