码迷,mamicode.com
首页 > 编程语言 > 详细

用Java原子变量的CAS方法实现一个自旋锁

时间:2016-10-26 14:08:29      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:死循环   package   rup   countdown   ack   tle   port   demo   throws   

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。

http://www.cnblogs.com/shijiaqi1066/p/5999610.html 

 

 

实现:

package sjq.mylock;

import java.util.concurrent.atomic.AtomicReference;

public class SpinLock {
    private AtomicReference<Thread> owner = new AtomicReference<>();
    
    public void lock(){
        Thread currentThread = Thread.currentThread();
        while(!owner.compareAndSet(null, currentThread)){  // owner == null ,则compareAndSet返回true,否则为false。
            //拿不到owner的线程,不断的在死循环
        }
    }
    
    public void unLock(){
        owner.set(null);
        // 也可以这样写,太麻烦,没必要
        /*
        Thread cur = Thread.currentThread();  
        owner.compareAndSet(cur, null);
         */
    }
    
}

 

 

测试:

package sjq.mylock;

import java.util.concurrent.CountDownLatch;

import org.junit.Test;

public class TestSpinLock {
    
    final static int THREAD_NUM = 100;
    static int x = 0;

    @Test
    public void testLock() throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(THREAD_NUM);
        
        //
        SpinLock spinLock = new SpinLock();
        
        for (int i = 0; i < THREAD_NUM; i++) {
            // 启动子线程
            new Thread(() -> {
                
                // 每个线程循环多次,频繁上锁,解锁。
                for (int n = 0; n < 100; n++) {
                    spinLock.lock();
                    x++;
                    spinLock.unLock();
                }
                
                latch.countDown();    // 子线程通知主线程,工作完毕。
            }).start();
        }
        latch.await();    // 主线程等待所有子线程结束。
        
        System.out.println(x);    // 最终打印结果:10000 ,未出现线程不安全的异常。
    }
}

 

 

 

 

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。

http://www.cnblogs.com/shijiaqi1066/p/5999610.html 

用Java原子变量的CAS方法实现一个自旋锁

标签:死循环   package   rup   countdown   ack   tle   port   demo   throws   

原文地址:http://www.cnblogs.com/shijiaqi1066/p/5999610.html

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