码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-04-30 18:32:40      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:ng2   new   getname   something   trace   期望值   直接   some   lock   

利用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(); }
}

 

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

标签:ng2   new   getname   something   trace   期望值   直接   some   lock   

原文地址:https://www.cnblogs.com/bj-xiaodao/p/10797016.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!