zoukankan      html  css  js  c++  java
  • Java--如何使用sun.misc.Unsafe完成compareAndSwapObject原子操作

    package com;
    
    import sun.misc.Unsafe;
    
    import java.lang.reflect.Field;
    
    /**
     * Created by yangyu on 16/11/24.
     */
    public class TestUnsafe {
    
        public static void main(String[] args) {
            Node node = new Node();
            /**
             * 通过CAS方法更新node的next属性
             * 原子操作
             */
            boolean flag = node.casNext(null,new Node());
            System.out.println(flag);
        }
    
        private static class Node{
    
            volatile Node next;
    
            /**
             * 使用Unsafe CAS方法
             * @param cmp 目标值与cmp比较,如果相等就更新返回true;如果不相等就不更新返回false;
             * @param val 需要更新的值;
             * @return
             */
            boolean casNext(Node cmp, Node val) {
                /**
                 * compareAndSwapObject(Object var1, long var2, Object var3, Object var4)
                 * var1 操作的对象
                 * var2 操作的对象属性
                 * var3 var2与var3比较,相等才更新
                 * var4 更新值
                 */
                return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
            }
    
            private static final sun.misc.Unsafe UNSAFE;
            private static final long nextOffset;
    
            static {
                try {
                    UNSAFE = getUnsafe();
                    Class<?> k = Node.class;
                    nextOffset = UNSAFE.objectFieldOffset
                            (k.getDeclaredField("next"));
                } catch (Exception e) {
                    throw new Error(e);
                }
            }
    
            /**
             * 获取Unsafe的方法
             * 获取了以后就可以愉快的使用CAS啦
             * @return
             */
            public static Unsafe getUnsafe() {
                try {
                    Field f = Unsafe.class.getDeclaredField("theUnsafe");
                    f.setAccessible(true);
                    return (Unsafe)f.get(null);
                } catch (Exception e) {
                    return null;
                }
            }
        }
    }
  • 相关阅读:
    元组,字典
    python字符串
    tensorflow 学习笔记
    tensorflow example1
    python第二章(2)列表
    python3.5学习第二章(1)标准库,bytes
    类加载过程
    数据值与地址值
    类的初始化与实例化顺序
    SpringCloudBus
  • 原文地址:https://www.cnblogs.com/eoss/p/6098822.html
Copyright © 2011-2022 走看看