public class HqaLock {
private static final Unsafe unsafe = reflectGetUnsafe();
private static final long ownerOffset;
/**
* 锁是否被持有(1)是,(0)否
*/
AtomicInteger state = new AtomicInteger(0);
/**
* 当前持有锁的线程
*/
volatile Thread owner = new Thread();
/**
* 线程等待池
*/
private Queue<Thread> waitQueue = new LinkedBlockingQueue();
/**
* 重入次数
*/
AtomicInteger reentrantCount = new AtomicInteger(0);
private static Unsafe reflectGetUnsafe() {
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
return (Unsafe) field.get(null);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
static {
try {
ownerOffset = unsafe.objectFieldOffset
(HqaLock.class.getDeclaredField("owner"));
} catch (Exception ex) { throw new Error(ex); }
}
public void lock(){
//未被持有则直接获取锁
if (state.get() == 0){
//自旋cas改变锁状态
for(;;){
boolean b = state.compareAndSet(0,1);
if (b == true){
unsafe.compareAndSwapObject(this,ownerOffset,owner,Thread.currentThread());
owner = Thread.currentThread();
reentrantCount.set(1);
break;
}
}
}else {//已经被持有
//持有锁的线程是是自己
if (unsafe.getObject(owner,ownerOffset) == Thread.currentThread()){
reentrantCount.getAndAdd(1);
}else {
waitQueue.add(Thread.currentThread());
//持有锁的线程不是自己
while (true){
//阻塞休眠
LockSupport.park();
//如果锁被持有者释放了
if (state.get() == 0){
owner = Thread.currentThread();
state.set(1);
break;
}
}
}
}
}
public void unlock() throws Exception {
if (unsafe.getObject(this,ownerOffset) != Thread.currentThread()){
throw new Exception("该线程未持有锁");
}
//重入次数减1
reentrantCount.getAndDecrement();
//直到重入锁全部解开的才能真正的解锁
if (reentrantCount.get() == 0){
state.set(0);
Thread head = waitQueue.peek();
LockSupport.unpark(head);
}
}
}
手写一个简易的ReentrantLock
最新推荐文章于 2023-08-01 15:38:41 发布