思路是通过unsafe类cas指令操作实现乐观锁
public class Test {
//需要反射一个unsafe类,jdk不允许直接获取这个对象实例
static Unsafe unsafe = null;
//锁状态
static volatile int state = 0;
//state偏移量
static long offset;
static {
try {
Field field = Unsafe.class.getDeclaredFields()[0];
field.setAccessible(true);
try {
//反射出对象
unsafe = (Unsafe) field.get(null);
//获取属性的偏移量
offset = unsafe.staticFieldOffset(Test.class.getDeclaredField("state"));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Test test = new Test();
new Thread(() -> {
lock(test);
System.out.println("线程1加锁================");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("线程1解锁================");
unlock(test);
}
},"1").start();
new Thread(() -> {
lock(test);
System.out.println("线程2加锁================");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("线程2解锁================");
unlock(test);
}
},"2").start();
}
public static void lock(Test test){
//如果cas成功,就代表加锁成功
while (!unsafe.compareAndSwapInt(test,offset,0,1)){
System.out.println("线程"+Thread.currentThread().getName()+"在循环");
System.out.println(unsafe.getIntVolatile(test,offset));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//强锁失败让出cpu
Thread.yield();
}
System.out.println("线程"+Thread.currentThread().getName()+"把state修改为"+unsafe.getIntVolatile(test,offset));
}
public static void unlock(Test test){
//解锁 状态设置为0
unsafe.getAndSetInt(test,offset,0);
System.out.println("修改state = 0");
}
}
运行后输出结果为: