Java Unsafe 常用API 例子。

1 线程挂起恢复

2 CAS操作

2 直接内存操作(非JVM内存)

3 实例化对象

4 直接操作对象属性

5 直接操作数组

示例代码如下

public class Player {

    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}
import java.lang.reflect.Field;

import com.alibaba.fastjson.JSON;
import com.guo.util.Util;

import sun.misc.Unsafe;

/**
 * unsafe 操作数组
 * @author GuoJunWei
 *
 */
public class Test1 {

    public static Unsafe unsafe = Util.getUnsafe();

    public static void main(String[] args) throws Exception {
        //function1();
        //function2();
        //function3();
        //function4();
        //function5();
        function6();
    }

    /**
     * park():方法返回条件
     * 1 当前现在调用过 unpark 方法 (多次调用 按照一次计算)
     * 2 当前线程被中断
     * 3 当park 为 false:时间块到了 单位纳秒
     * 4 当park 为 true:时间是绝对时间(1970)年 到期 单位毫秒
     */
    public static void function6() {
        System.out.println("Start");
        long time = System.currentTimeMillis()+3000l;
        unsafe.park(true,time);
        System.out.println("end");
    }

    /**
     * CAS操作
     * @throws Exception
     */
    public static void function5() throws Exception {

        Player player = (Player) unsafe.allocateInstance(Player.class);

        Field age = player.getClass().getDeclaredField("age");

        long addressAge = unsafe.objectFieldOffset(age);

        unsafe.compareAndSwapInt(player, addressAge, 0, 100);

        System.out.println(player.getAge());

    }

    /**
     * 直接分配内存地址:内存管理
     */
    public static void function4() {
        //分配100字节内存  返回初始地址
        long address = unsafe.allocateMemory(100);
        //往分配的内存地址写入值
        unsafe.putInt(address, 55);
        //获取值
        System.out.println(unsafe.getInt(address));

        //分配100字节内存  返回初始地址
        long address1 = unsafe.allocateMemory(100);

        //copy 内存值
        unsafe.copyMemory(address, address1, 4);

        System.out.println(unsafe.getInt(address1));

        //释放内存
        unsafe.freeMemory(address);
        unsafe.freeMemory(address1);

    }

    /**
     * 操作对象属性值
     * @throws Exception
     */
    public static void function3() throws Exception {

        Player player = (Player) unsafe.allocateInstance(Player.class);

        Field fieldName = player.getClass().getDeclaredField("name");

        Field fieldAge = player.getClass().getDeclaredField("age");

        long fileNameaddres = unsafe.objectFieldOffset(fieldName);

        long fileAgeaddres = unsafe.objectFieldOffset(fieldAge);

        unsafe.putObjectVolatile(player, fileNameaddres, "wangWu");

        unsafe.putInt(player,fileAgeaddres, 100);

        System.out.println(player.getAge()+"  "+player.getName());

    }

    /**
     * 实例化对象
     * @throws InstantiationException
     */
    public static void function2() throws InstantiationException {

        Player player = (Player) unsafe.allocateInstance(Player.class);

        player.setAge(100);

        player.setName("zhangShan");

        System.out.println(player.getAge()+"  "+player.getName());
    }

    /**
     * 对数组的操作
     */
    public static void function1() {
        int[] num = new int[7];

        //数组的起始地址
        long adress = unsafe.arrayBaseOffset(int[].class);
        //block 大小
        long index = unsafe.arrayIndexScale(int[].class);

        unsafe.putInt(num, adress,1);
        unsafe.putInt(num, adress+index, 2);
        unsafe.putInt(num, adress+index+index, 3);
        unsafe.putInt(num, adress+index+index+index, 4);

        System.out.println(JSON.toJSONString(num));

    }
}

原文地址:https://www.cnblogs.com/guojunwei/p/8413575.html

时间: 2024-11-10 13:08:04

Java Unsafe 常用API 例子。的相关文章

Java 之常用API

常用API  1 API概述  2 Scanner类与String类  3 StringBuilder类 NO.one API概述 1.1 API概述 API(Application Programming Interface) : 应用程序编程接口 编写一个机器人程序去控制机器人踢足球,程序就需要向机器人发出向前跑.向后跑.射门.抢球等各种命令,没有编过程序的人很难想象这样的程序如何编写.但是对于有经验的开发人员来说,知道机器人厂商一定会提供一些用于控制机器人的Java类,这些类中定义好了操作

java自学-常用api

API(Application Programming Interface),应用程序编程接口.Java API是JDK中提供给我们使用的类的说明文档.即jdk包里边写好的类,这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可.所以我们可以通过查询API的方式,来学习Java提供的类,并得知如何使用它们. 例子 ArrayList<String> list = new ArrayList<String>(); ArrayList就是一个

Java的常用API

Object类 1.toString方法在我们直接使用输出语句输出对象的时候,其实通过该对象调用了其toString()方法. 2.equals方法方法摘要:类默认继承了Object类,所以可以使用Object类的equals方法boolean equals(Object obj)指示其他某个对象是否与此对象“相等”. equalse方法源码: public boolean equals(Object obj){ return (this == obj); } 参数: Object obj:可以

黑马程序员——java基础---常用API

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.String类 概念:String类代表字符串.Java 程序中的所有字符串字面值("abc")都作为此类的实例实现.又因为该类被final修饰,表明它不能被其它类所继承,其下的一系列关于字符串的操作方法也就无法被复写. 特点:字符串一旦被创建,将无法改变其值. 1 public class StringTest { 2 3 public static void main(Str

java进阶--常用API

一.Scanner 类 1.位于Java.util包中 2.作用:用于接收键盘录入数据 3.格式:Scanner sc = new Scanner(System.in) 4.常用方法:hasNextXxx():用于比较输入类型是否相匹配   nextXxx():用于获取数据 二.String类 1.位于Java.lang包中 2.字符串:就是多个字符组成的一串数据,也可以看成一个字符数组: API:A:字符串面值 ”abc“,也可以看成一个字符串对象:   B:字符串是常量,一旦被赋值,不能被改

java之常用API

1 Scanner类 1.1 API的概述 API (Application Program Interface):应用程序接口:是Java提供很多类和接口以来帮助我们编程.我们在拿到一个API文档的时候,第一个要看包路径:第二看构造方法:第三看方法摘要. 1.2 引用类型的使用步骤 功能:可以实现键盘输入数据. 引用类型的一般使用步骤:(除了基本数据类型,都是引用类型,所以scanner也是一个引用类型) (1)导包 import 包路径.包名称: 特殊情况:在java的API中,只有java

Java反射常用API汇总

"JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性" 一.类对象的获取 1.通过对象获取 Object obj = new Object(); obj.getClass(); 2.通过类名获取 Object.class; 3.通过类的路径名获取 Class.forName("com.metadata.Student"); 二.类的实例化和构造函数 获取到的class对象可以直接通过cla

java操作常用Api

1.xml解析 需要导入dom4j-full.jar包 SAXreader sax = new SAXreader(); //创建SAXreader Document doc = sax.read("地址"或者new File("地址"));        //读取一个xml文件 Element elEmp = doc.getRootElement(); //获取根元素 这里如果要找到根元素下面所有的元素如: List<Element> list = e

hadoop java接口及常用api

# java接口及常用api package com.yting.hadoop.hdfs; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputS