CAS之基本类型与引用类型

Wesley13
• 阅读 701

CAS之基本类型与引用类型

1.1 long

static final Unsafe unsafe ;
static Long offset;
private volatile long  state= 1;

static {
    try {
        Field field = Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        unsafe = (Unsafe)field.get(null);    
        offset = unsafe.objectFieldOffset(TestUnsafe.class.getDeclaredField("state"));
    } catch (Exception e) {
        System.out.println(e.getLocalizedMessage());
        throw new Error(e);
    }
}

public static void main(String[] args) {
    TestUnsafe testUnsafe = new TestUnsafe();
    boolean success = unsafe.compareAndSwapLong(testUnsafe,offset,1,3);
    System.out.println("sucess:"+success+" after cas:"+testUnsafe.state);
}

1.2 Long

static final Unsafe unsafe ;
static Long offset;
//等同于Long.valueOf(1L)==>new Long(1L),是引用类型
private volatile Long  state= 1L;

static {
​    try {
​        Field field = Unsafe.class.getDeclaredField("theUnsafe");
​        field.setAccessible(true);
​        unsafe = (Unsafe)field.get(null);    
​        offset = unsafe.objectFieldOffset(TestUnsafe2.class.getDeclaredField("state"));
​    } catch (Exception e) {
​        System.out.println(e.getLocalizedMessage());
​        throw new Error(e);
​    }
}
public static void main(String[] args) {
​    TestUnsafe2 testUnsafe = new TestUnsafe2();
​    boolean success = unsafe.compareAndSwapObject(testUnsafe,offset,1L,3L);
​    //此处若换成 boolean success = unsafe.compareAndSwapLong(testUnsafe,offset,1L,3L);将失败,因为state是引用类型,不能用直接实际的值来比较,而应该用引用的实际内存地址做对比
​    System.out.println("sucess:"+success+" after cas:"+testUnsafe.state);
}

​
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
Wesley13 Wesley13
3年前
java 复制Map对象(深拷贝与浅拷贝)
java复制Map对象(深拷贝与浅拷贝)CreationTime2018年6月4日10点00分Author:Marydon1.深拷贝与浅拷贝  浅拷贝:只复制对象的引用,两个引用仍然指向同一个对象
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java中的基本数据类型和引用数据类型的区别
一、前言众所周知Java是一种强类型语言,在Java语言中,Java的数据类型一共分为两大类,分别为基本数据类型和引用数据类型,其中基本数据类型细分小类可分为整数类型、浮点类型、字符类型、布尔类型这四小类。二、基本数据类型和引用数据类型1\.基本数据类型只有
Wesley13 Wesley13
3年前
JAVA 基本类型与 引用类型区别
 栈与堆都是Java用来在Ram中存放数据的地方。与C不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。       Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的
可莉 可莉
3年前
06_java之类概述
01引用数据类型\_类A:数据类型a:java中的数据类型分为:基本类型和引用类型B:引用类型的分类a:Java为我们提供好的类,比如说:Scanner,Random等。b:我们自己创建的类,按照类的定义标准,可以在类中包含多个方法与属性,来供我
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
JVM调优总结一
数据类型   Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte,short,int,long,cha
Wesley13 Wesley13
3年前
JAVA基本类型和引用类型
一、基本数据类型java中一共分为8种基本数据类型:byte、short、int、long、float、double、char、boolean,其中byte、short、int、long是整型。float、double是浮点型,char是字符型,boolean是布尔型。二、引用类型j
Stella981 Stella981
3年前
JVM调优总结(一)基本概念
数据类型Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。    基本类型:保存原始值,即:他代表的值就是数值本身;    引用类型:保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引