在AQS中,可以看到使用了很多native方法去实现CAS操作。
下面分析一下,是如何实现折现线程安全的操作,首先需要用到Unsafe类,从名字就能看出来这是个 “不安全”的类,因为它提供了对底层内存的直接操作。
首先获取一个 Unsafe实例,然后获取类中字段的偏移量。
private static final Unsafe U = Unsafe.getUnsafe();
private static final long STATE
= U.objectFieldOffset(AbstractQueuedSynchronizer.class, "state");
private static final long HEAD
= U.objectFieldOffset(AbstractQueuedSynchronizer.class, "head");
private static final long TAIL
= U.objectFieldOffset(AbstractQueuedSynchronizer.class, "tail");
然后将对象实例,偏移量,以及expect值,和更新的值传入进到 Unsafe类提供的compareAndSetInt()中。
Unsafe便会调用native方法去原子性更新STATE指向的内存的值。
如果操作时的值等于传入的expect值那么原子性更新为update的值,返回true;如果不是说明已经发生了更新,那么便不会更新返回false;
protected final boolean compareAndSetState(int expect, int update) {
return U.compareAndSetInt(this, STATE, expect, update);
}
public final native boolean compareAndSetInt(Object o, long offset,
int expected,
int x);
1228

被折叠的 条评论
为什么被折叠?



