Java实现自定义自旋锁代码实例
作者:码农回忆录
这篇文章主要介绍了Java实现自定义自旋锁代码实例,Java自旋锁是一种线程同步机制,它允许线程在获取锁时不立即阻塞,而是通过循环不断尝试获取锁,直到成功获取为止,自旋锁适用于锁竞争激烈但持有锁的时间很短的情况,需要的朋友可以参考下
自旋锁
1.空轮询实现
- 此处主要利用while空轮询以及原子包的CAS
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提升性能
- 第二种方式虽然能让程序暂停但是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 {
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自定义自旋锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
