Unsafe-java7之后的CAS

Unsafe

java7之后在并发中大量使用Unsafe来保证并发状态,字段修改的唯一性

代码例子

例如在AbstractQueuedSynchronizer中的CAS中

1
2
3
4
5
6
7
8
9
//创建unsafe对象
private static final Unsafe unsafe = Unsafe.getUnsafe();

//计算字段的偏移量
stateOffset = unsafe.objectFieldOffset
(AbstractQueuedSynchronizer.class.getDeclaredField("state"));

//CAS修改方法,第二个至是计算出的偏移量,第3个值是原有值,第4个参数是修改之后的值,success-true,faild-false
unsafe.compareAndSwapObject(this, tailOffset, expect, update);

阻塞线程park和unpark

park和unpark与object.wait() object.notify一样都是可以阻塞和唤醒线程但是俩这有如下区别:

  1. 面向的主体不同,LockSupport的park, unpark面向的是线程,而Object.wait, nofify面向的是对象
  2. 底层实现机制不同,可以看到Object的wait, notify方法也是native方法,Unsafe的park和unpark方法也是native方法,底层实现不同,Object.notify不能唤醒Unsafe park的线程。