java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java自定义自旋锁

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

作者:码农回忆录

这篇文章主要介绍了Java实现自定义自旋锁代码实例,Java自旋锁是一种线程同步机制,它允许线程在获取锁时不立即阻塞,而是通过循环不断尝试获取锁,直到成功获取为止,自旋锁适用于锁竞争激烈但持有锁的时间很短的情况,需要的朋友可以参考下

自旋锁

1.空轮询实现

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)){
        }
    }
    public 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提升性能

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 {
    private 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实现自定义自旋锁代码实例的文章就介绍到这了,更多相关Java自定义自旋锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文