首页 > 代码库 > 用Java原子变量的CAS方法实现一个自旋锁
用Java原子变量的CAS方法实现一个自旋锁
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。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方法实现一个自旋锁
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。