开发者

Java实现自定义自旋锁代码实例

目录
  • 自旋锁
    • 1.空轮询实现
    • 2. sleep提升性能
    • 3. Unsafe提升性能

自旋锁

1.空轮询实现

  • 此处主要利用while空轮询以及原子包的CAS
package com.gy.spinlock;
import Java.util.concurrepythonnt.atomic.AtomicInteger;
/**
 * 利用空轮询实现
 */
public class SpinLock01 {
    private AtomicInteger state = new AtomicInteger(0);
    public void lock() {
        while (!state.compareAndSet(0, 1)){
        }
    }
    publicwww.devze.com void unLock() {
        state.compareAndSet(1, 0);
    }
}

2. sleep提升性能

  • 第一种实现问题比较明显,当我们的线程没有获得锁之前都是空轮询,此时我们可以让没有获取锁的线程停止
package com.gy.spinlock;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * 利用空轮询实现
 */
public class SpinLock01 {
    private AtomicInteger state = new AtomicInteger(编程0);
    public void lock() {
        while (!state.compareAndSet(0, 1)){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public void unLock() {
        state.compareAndSet(1, 0);
    }
}

3. Unsafe提升性能

  • 第二种方式虽然能让程序暂停但是sleep的时间是不好控制的,那么这里有没有一种方式可以直接让程序停止知道unlock的时候才被唤醒
  • park方法和unPark方法就能实现这样的功能
  • 此处unLock处不一定就是unPark的线程获得锁
  • 此处加锁解锁是否同一线程并未处理,处理方式只需要记录加锁线程解锁时判断即可
package com.gy.spinlock;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;
/**
 * 利用空轮询实现
 */
public class SpinLock01 {
    privatpythone AtomicInteger state = new AtomicInteger(0);
    private Queue<Thread> queue = new LinkedList();
    public void lock() {
        while (!state.compareAndSet(0, 1)){
            queue.add(Thread.currentThread());
            LockSupport.park();
        }
    }
    public void unLock() {
        state.compareAndSet(1, 0);
        LockSupport.unpark(queue.poll());
    }
}

到此这篇关于Java实现自定义自旋php锁代码实例的文章就介绍到这了,更多相关Java自定义自旋锁内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜