自旋锁
是指尝试获取锁的线程不会立即被阻塞而是采用循环的方式去获取锁,这样的好处是减少上下文切换消耗,缺点是循环会消耗CPU...
Unsafe
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
手写自旋锁
上代码
package com.example.demo;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
public class SplitLockDemo {
//原子引用线程
AtomicReference<Thread> atomicReference = new AtomicReference<>();
public void myLock() {
Thread thread = Thread.currentThread();
System.out.println(Thread.currentThread().getName() + "\t come in......");
while (!atomicReference.compareAndSet(null, thread)) {
}
}
public void MyUnLock() {
Thread thread = Thread.currentThread();
atomicReference.compareAndSet(thread, null);
System.out.println(Thread.currentThread().getName() + "\t invock MyUnLock");
}
public static void main(String[] args) {
SplitLockDemo splitLockDemo = new SplitLockDemo();
new Thread(() -> {
try {
splitLockDemo.myLock();
try {
TimeUnit.SECONDS.sleep(5);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
splitLockDemo.MyUnLock();
}, "AAA").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(() -> {
try {
splitLockDemo.myLock();
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
splitLockDemo.MyUnLock();
} catch (Exception e) {
e.printStackTrace();
}
}, "BBB").start();
}
}