zoukankan      html  css  js  c++  java
  • JDK中的rt.jar包中Unsafe类使用demo

    package com.example.demo.util;
    
    /**
     * JDK的rt.jar包中Unsafe类提供了硬件级别的非阻塞(一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法)原子性操作,
     * Unsafe类中方法都是native方法,它们使用JNI的方式访问本地C++实现库。
     * rt.jar包中的类都是通过BootStrap类加载器进行加载的。
     * 在本类中获取Unsage类的实例只能通过反射获取。
     * 
     * 独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的
     * 线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐
     * 观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就
     * 重试,直到成功为止。乐观锁用到的机制就是CAS,Compare and Swap。
     */
    import java.lang.reflect.Field;
    
    import sun.misc.Unsafe;
    
    public class TestUnSafe {
    	static final Unsafe unsafe;// = Unsafe.getUnsafe();抛出SecurityException
    	static final long stateOffset;
    
    	private volatile long state = 0;// 多线程下保证内存可见性
    
    	static {
    		try {
    
    			Field field = Unsafe.class.getDeclaredField("theUnsafe");
    			field.setAccessible(true);
    			unsafe = (Unsafe) field.get(null);
    			stateOffset = unsafe.objectFieldOffset(TestUnSafe.class.getDeclaredField("state"));// 获取state变量在类中的偏移量
    			System.out.println("stateOffset=" + stateOffset);
    
    		} catch (Exception e) {
    			System.out.println(e.getLocalizedMessage());
    			throw new Error(e);
    		}
    	}
    
    	public static void main(String[] args) {
    		TestUnSafe test = new TestUnSafe();
    		Boolean success = unsafe.compareAndSwapInt(test, stateOffset, 0, 1);// CAS原子性操作,当前实例所在偏移量为stateOffset的内存位置值为0,则更新为1.
    		System.out.println(success);
    		System.out.println("state=" + test.state);
    
    	}
    
    }
    

      执行结果:

    stateOffset=16
    true
    state=1
  • 相关阅读:
    张建(北京工业大学软件学院副教授)_百度百科
    孤独患者马天宇:独自生存我也会适应得很好_红人访_腾讯娱乐_腾讯网
    zz
    java~springboot~ibatis Invalid bound statement (not found)原因
    数据库~dotnetcore连接Mysql插入中文失败
    k8s~术语解释
    springboot~让我习惯了TDD的开发模式
    POJ 2498 Martian Mining
    Java中的DeskTop类
    我和ip_conntrack不得不说的一些事
  • 原文地址:https://www.cnblogs.com/itfeng813/p/14702663.html
Copyright © 2011-2022 走看看