`

java Unsafe类的compareAndSwap方法

 
阅读更多
compareAndSwap是个原子方法,原理是cas.就是说如果他是xx,那么就改为xxx.
这个是高效,而且是原子的,不用加锁.
也不用但是其他值改了而产生误操作,应为会先判断当前值,符合期望才去改变.

直接上代码吧


package com.huangyunbin;
import java.lang.reflect.Field;
import sun.misc.Unsafe;


public class UnsafeTest {

    private static Unsafe unsafe;

    static {
        try {
            //通过反射获取rt.jar下的Unsafe类
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            unsafe = (Unsafe) field.get(null);
        } catch (Exception e) {
            System.out.println("Get Unsafe instance occur error"+ e);
        }
    }




    public static void main(String[] args) throws Exception
    {
        Class clazz = Target.class;
        Field[] fields = clazz.getDeclaredFields();
        System.out.println("fieldName:fieldOffset");
        for (Field f : fields) {
            // 获取属性偏移量,可以通过这个偏移量给属性设置
            System.out.println(f.getName() + ":" + unsafe.objectFieldOffset(f));
        }
        Target target = new Target();
        Field intFiled  =  clazz.getDeclaredField("intParam")  ;
        int a=(Integer)intFiled.get(target ) ;
        System.out.println("原始值是:"+a);
        //intParam的字段偏移是12 原始值是3 我们要改为10
        System.out.println(unsafe.compareAndSwapInt(target, 12, 3, 10));
        int b=(Integer)intFiled.get(target) ;
        System.out.println("改变之后的值是:"+b);

        //这个时候已经改为10了,所以会返回false
        System.out.println(unsafe.compareAndSwapInt(target, 12, 3, 10));

        System.out.println(unsafe.compareAndSwapObject(target, 24, null, "5"));
    }
}


 class Target {
     int intParam=3;
     long longParam;
     String strParam;
     String strParam2;
}



结果是:
fieldName:fieldOffset
intParam:12
longParam:16
strParam:24
strParam2:28
原始值是:3
true
改变之后的值是:10
false
true


compareAndSwapInt是通过反射根据字段偏移去修改对象的.
可以看到int是4个字节的偏移量,long是4个字节的偏移量,string是4个字节的偏移量
注意 Unsafe的对象不能直接new,要通过反射去获取.
分享到:
评论
1 楼 mxdxm 2015-10-09  

相关推荐

    Java Unsafe类的使用.docx

    而CAS(Compare and Swap,比较并交换)算法的引入,提供了无锁编程的可能性。CAS操作包含三个参数:内存地址、预期值和新值。当预期值与内存地址当前的值相匹配时,才会更新内存地址的值为新值,整个过程是原子性的...

    Java Unsafe类1

    4. CAS(Compare and Swap)操作: CAS是无锁编程中的关键操作,`Unsafe`类提供了CAS操作,如`compareAndSwapInt(Object o, long offset, int expected, int x)`等。CAS尝试将内存位置的值与预期值进行比较,如果...

    一篇看懂Java中的Unsafe类

    2. **CAS(Compare and Swap)操作**:在并发编程中,`Unsafe`提供了原子性的CAS操作,通过内存偏移地址修改变量值。例如,`SynchronousQueue`中的`TransferStack`使用CAS更新栈顶节点。 ```java private static ...

    Java Unsafe类实现原理及测试代码

    `Unsafe`类包含了一些多线程同步的机制,如锁操作和CAS(Compare and Swap)操作。虽然`monitorEnter`、`tryMonitorEnter`和`monitorExit`已不建议使用,但`compareAndSwapInt`等CAS方法是无锁编程的关键,广泛应用于`...

    Java中unsafe操作实例总结

    Java中unsafe操作实例总结 Java中unsafe操作是Java无锁操作的基石,在...Unsafe操作是Java无锁操作的基石,它提供了多种原子操作,例如compareAndSwap、putOrder等,可以应用于多种场景,例如原子变量、并发集合类等。

    简单谈一谈Java中的Unsafe类

    - `compareAndSwap*`、`getAndSet*`等原子操作:用于并发编程,提供类似锁的效果,但性能更高。 4. **线程操作**: - `park`和`unpark`:控制线程的暂停和恢复,可用于自定义同步原语。 - `getThreadParkBlocker...

    JDK Unsafe 源码注释

    虽然Oracle发行的JDK版本不包含Unsafe的源代码,但在并发编程中,Unsafe类为java.util.concurrent包里的类提供了底层支持,例如通过提供绕过JVM直接修改内存的能力和使用硬件CPU指令实现CAS(Compare-And-Swap)原子...

    Java 多线程与并发(8-26)-JUC原子类- CAS, Unsafe和原子类详解.pdf

    Java多线程与并发处理是Java编程中的高级话题,涉及到JUC(java.util.concurrent)包中的原子类、CAS(Compare-And-Swap)机制、Unsafe类以及多线程并发的无锁方案和线程安全的实现方法。 CAS是一种无锁的同步机制...

    JAVA CAS深度分析

    JAVA CAS(Compare And Swap)是一种原子操作,用于在多线程环境中实现同步机制。CAS 通过将内存值 V、旧的预期值 A 和要修改的新值 B 进行比较,如果预期值 A 和内存值 V 相同时,将内存值 V 修改为 B,否则什么都...

    深入分析Java并发编程之CAS

    public void compareAndSwap(int expectedValue, int newValue) { while (true) { int currentValue = state; if (currentValue == expectedValue) { if (unsafe.compareAndSwapInt(this, stateOffset, ...

    深入了解Java atomic原子类的使用方法和原理

    在Java中,Atomic原子类使用Unsafe类的compareAndSwapInt方法来实现CAS算法。compareAndSwapInt方法将当前的值与预期的值进行比较,如果相等,则更新当前的值。 volatile关键字 在Atomic原子类中,使用volatile...

    不可不说的Java"锁"事1

    CAS(Compare And Swap)是一种无锁编程技术,它在Java中主要通过`java.util.concurrent.atomic`包中的原子类实现。CAS操作比较目标变量`V`当前值是否等于预期值`A`,如果相等,则更新为新值`B`,整个过程是原子性...

    Java-并发容器之ConcurrentHashMap

    此外,`sun.misc.Unsafe`类在ConcurrentHashMap的实现中扮演重要角色,其提供的原子操作方法(如compareAndSwap*)利用CAS算法确保线程安全,这种方法在没有竞争的情况下效率极高,即使发生冲突,重试次数也是有限的...

    Java16个原子类介绍-基于JDK8.docx

    原子类的核心在于它们提供的原子操作方法,例如`compareAndSet()`、`getAndSet()`、`getAndIncrement()`等。以`AtomicInteger`的`getAndIncrement()`为例,这个方法在不发生数据竞争的情况下,可以确保自增操作的...

    Java并发编程:设计原则与模式(第二版)-3

    6. **原子性操作与CAS**:Java提供了一组原子变量类(AtomicInteger、AtomicLong等)和Unsafe类,它们支持无锁编程和CAS(Compare and Swap)操作,用于实现高效且线程安全的更新操作。 7. **并发异常处理**:书中...

    多线程训练营资料1.xls.md

    根据提供的文件信息,可以看出这份资料主要关注的是Java中与多线程相关的高级同步机制,特别是CAS(Compare and Swap)操作、自旋锁以及Unsafe类的使用。下面将详细阐述这些概念及其应用场景。 ### CAS (Compare ...

    JAVA CAS实现原理与使用.docx

    Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,它提供了一种在多线程环境下更新共享变量的方式,避免了传统锁机制带来的诸多问题。在JDK 5之前,Java主要依赖`synchronized`关键字来保证线程...

    Java 多线程与并发(15-26)-JUC集合- ConcurrentLinkedQueue详解.pdf

    - **构造方法**:构造方法使用`Unsafe`类的`putObject`方法初始化`item`字段,该方法使用了`CAS`(Compare and Swap)操作,保证了原子性。 - **CAS操作**:`casItem`方法用于原子性地更新`item`字段,`casNext`用于...

Global site tag (gtag.js) - Google Analytics