CAS之基本类型与引用类型

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 { 7try { 8Field 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) { 13System.out.println(e.getLocalizedMessage()); 14throw new Error(e); 15} 16} 17public static void main(String[] args) { 18TestUnsafe2 testUnsafe = new TestUnsafe2(); 19​ boolean success = unsafe.compareAndSwapObject(testUnsafe,offset,1L,3L); 20//此处若换成 boolean success = unsafe.compareAndSwapLong(testUnsafe,offset,1L,3L);将失败,因为state是引用类型,不能用直接实际的值来比较,而应该用引用的实际内存地址做对比 21System.out.println("sucess:"+success+" after cas:"+testUnsafe.state); 22} 23 24
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java 复制Map对象(深拷贝与浅拷贝)

java复制Map对象(深拷贝与浅拷贝)CreationTime2018年6月4日10点00分Author:Marydon1.深拷贝与浅拷贝  浅拷贝:只复制对象的引用,两个引用仍然指向同一个对象

Java中的基本数据类型和引用数据类型的区别

一、前言众所周知Java是一种强类型语言,在Java语言中,Java的数据类型一共分为两大类,分别为基本数据类型和引用数据类型,其中基本数据类型细分小类可分为整数类型、浮点类型、字符类型、布尔类型这四小类。二、基本数据类型和引用数据类型1\.基本数据类型只有

JAVA 基本类型与 引用类型区别

 栈与堆都是Java用来在Ram中存放数据的地方。与C不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。       Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的

CAS之基本类型与引用类型 - HelloWorld