CAS之基本类型与引用类型
1.1 long
1static final Unsafe unsafe ; 2static Long offset; 3private volatile long state= 1; 4 5static { 6 try { 7 Field field = Unsafe.class.getDeclaredField("theUnsafe"); 8 field.setAccessible(true); 9 unsafe = (Unsafe)field.get(null); 10 offset = unsafe.objectFieldOffset(TestUnsafe.class.getDeclaredField("state")); 11 } catch (Exception e) { 12 System.out.println(e.getLocalizedMessage()); 13 throw new Error(e); 14 } 15} 16 17public static void main(String[] args) { 18 TestUnsafe testUnsafe = new TestUnsafe(); 19 boolean success = unsafe.compareAndSwapLong(testUnsafe,offset,1,3); 20 System.out.println("sucess:"+success+" after cas:"+testUnsafe.state); 21} 22 23
1.2 Long
1static final Unsafe unsafe ; 2static Long offset; 3//等同于Long.valueOf(1L)==>new Long(1L),是引用类型 4private volatile Long state= 1L; 5 6static { 7 try { 8 Field field = Unsafe.class.getDeclaredField("theUnsafe"); 9 field.setAccessible(true); 10 unsafe = (Unsafe)field.get(null); 11 offset = unsafe.objectFieldOffset(TestUnsafe2.class.getDeclaredField("state")); 12 } catch (Exception e) { 13 System.out.println(e.getLocalizedMessage()); 14 throw new Error(e); 15 } 16} 17public static void main(String[] args) { 18 TestUnsafe2 testUnsafe = new TestUnsafe2(); 19 boolean success = unsafe.compareAndSwapObject(testUnsafe,offset,1L,3L); 20 //此处若换成 boolean success = unsafe.compareAndSwapLong(testUnsafe,offset,1L,3L);将失败,因为state是引用类型,不能用直接实际的值来比较,而应该用引用的实际内存地址做对比 21 System.out.println("sucess:"+success+" after cas:"+testUnsafe.state); 22} 23 24