compareAndSwap是个原子方法,原理是CAS,即将内存中的值与期望值进行比较,如果相等,就将内存中的值修改成新值并返回true。
package com.java.magic.part4.exception; import java.lang.reflect.Field; import sun.misc.Unsafe; class Target{ int intParam = 3; long longParam; String strParam; } public class UnsafeTest { private static Unsafe unsafe; static{ try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); unsafe = (Unsafe)field.get(null); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { Class clazz = Target.class; Field[] fields = clazz.getDeclaredFields(); System.out.println("fieldNameeeee:fieldOffset"); for(Field f : fields){ //获取属性偏移量,可以通过这个偏移量给属性设值 System.out.println(f.getName()+" : "+unsafe.objectFieldOffset(f)); } System.out.println("--------------------------------"); Target target = new Target(); Field intParam = clazz.getDeclaredField("intParam"); int a = (Integer) intParam.get(target); System.out.println("intParam原始值:"+a); long intParamOffset = unsafe.objectFieldOffset(intParam); System.out.println("intParam实例变量偏移量:"+intParamOffset); //intParam实例变量偏移量是offset 原始值是3,我们要改成10 System.out.println(unsafe.compareAndSwapInt(target, intParamOffset, 3, 10)); System.out.println("intParam改变之后的值:"+target.intParam); System.out.println("--------------------------------"); //这个时候已经改为10了,所以会返回false System.out.println(unsafe.compareAndSwapInt(target, intParamOffset, 3, 10)); System.out.println("--------------------------------"); Field strParam = clazz.getDeclaredField("strParam"); String str = (String) strParam.get(target); System.out.println("strParam原始值:"+str); long strParamOffset = unsafe.objectFieldOffset(strParam); System.out.println("strParam实例变量的偏移量是:"+strParamOffset); System.out.println(unsafe.compareAndSwapObject(target, strParamOffset, null, "5")); System.out.println("strParam改变之后的值:"+target.strParam); } }
运行结果如下:
compareAndSwapInt是通过调用本地方法根据字段偏移去修改对象属性的.
可以看到int是4个字节的偏移量,long是8个字节的偏移量
注意:Unsafe的对象不能直接new,这里通过反射去获取Unsafe里面的私有成员变量theUnsafe
相关推荐
而CAS(Compare and Swap,比较并交换)算法的引入,提供了无锁编程的可能性。CAS操作包含三个参数:内存地址、预期值和新值。当预期值与内存地址当前的值相匹配时,才会更新内存地址的值为新值,整个过程是原子性的...
4. CAS(Compare and Swap)操作: CAS是无锁编程中的关键操作,`Unsafe`类提供了CAS操作,如`compareAndSwapInt(Object o, long offset, int expected, int x)`等。CAS尝试将内存位置的值与预期值进行比较,如果...
2. **CAS(Compare and Swap)操作**:在并发编程中,`Unsafe`提供了原子性的CAS操作,通过内存偏移地址修改变量值。例如,`SynchronousQueue`中的`TransferStack`使用CAS更新栈顶节点。 ```java private static ...
Java中unsafe操作实例总结 Java中unsafe操作是Java无锁操作的基石,在...Unsafe操作是Java无锁操作的基石,它提供了多种原子操作,例如compareAndSwap、putOrder等,可以应用于多种场景,例如原子变量、并发集合类等。
`Unsafe`类包含了一些多线程同步的机制,如锁操作和CAS(Compare and Swap)操作。虽然`monitorEnter`、`tryMonitorEnter`和`monitorExit`已不建议使用,但`compareAndSwapInt`等CAS方法是无锁编程的关键,广泛应用于`...
- `compareAndSwap*`、`getAndSet*`等原子操作:用于并发编程,提供类似锁的效果,但性能更高。 4. **线程操作**: - `park`和`unpark`:控制线程的暂停和恢复,可用于自定义同步原语。 - `getThreadParkBlocker...
虽然Oracle发行的JDK版本不包含Unsafe的源代码,但在并发编程中,Unsafe类为java.util.concurrent包里的类提供了底层支持,例如通过提供绕过JVM直接修改内存的能力和使用硬件CPU指令实现CAS(Compare-And-Swap)原子...
这些类的实现依赖于底层硬件的CAS(Compare-And-Swap)操作,确保多线程环境下的数据安全。Unsafe类的功能:Unsafe类作为Java的隐藏秘密,提供底层内存控制和其他高级操作。它允许直接访问和修改内存,操作类和对象...
Java多线程与并发处理是Java编程中的高级话题,涉及到JUC(java.util.concurrent)包中的原子类、CAS(Compare-And-Swap)机制、Unsafe类以及多线程并发的无锁方案和线程安全的实现方法。 CAS是一种无锁的同步机制...
JAVA CAS(Compare And Swap)是一种原子操作,用于在多线程环境中实现同步机制。CAS 通过将内存值 V、旧的预期值 A 和要修改的新值 B 进行比较,如果预期值 A 和内存值 V 相同时,将内存值 V 修改为 B,否则什么都...
public void compareAndSwap(int expectedValue, int newValue) { while (true) { int currentValue = state; if (currentValue == expectedValue) { if (unsafe.compareAndSwapInt(this, stateOffset, ...
在Java中,Atomic原子类使用Unsafe类的compareAndSwapInt方法来实现CAS算法。compareAndSwapInt方法将当前的值与预期的值进行比较,如果相等,则更新当前的值。 volatile关键字 在Atomic原子类中,使用volatile...
CAS(Compare And Swap)是一种无锁编程技术,它在Java中主要通过`java.util.concurrent.atomic`包中的原子类实现。CAS操作比较目标变量`V`当前值是否等于预期值`A`,如果相等,则更新为新值`B`,整个过程是原子性...
此外,`sun.misc.Unsafe`类在ConcurrentHashMap的实现中扮演重要角色,其提供的原子操作方法(如compareAndSwap*)利用CAS算法确保线程安全,这种方法在没有竞争的情况下效率极高,即使发生冲突,重试次数也是有限的...
原子类的核心在于它们提供的原子操作方法,例如`compareAndSet()`、`getAndSet()`、`getAndIncrement()`等。以`AtomicInteger`的`getAndIncrement()`为例,这个方法在不发生数据竞争的情况下,可以确保自增操作的...
6. **原子性操作与CAS**:Java提供了一组原子变量类(AtomicInteger、AtomicLong等)和Unsafe类,它们支持无锁编程和CAS(Compare and Swap)操作,用于实现高效且线程安全的更新操作。 7. **并发异常处理**:书中...
根据提供的文件信息,可以看出这份资料主要关注的是Java中与多线程相关的高级同步机制,特别是CAS(Compare and Swap)操作、自旋锁以及Unsafe类的使用。下面将详细阐述这些概念及其应用场景。 ### CAS (Compare ...
Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,它提供了一种在多线程环境下更新共享变量的方式,避免了传统锁机制带来的诸多问题。在JDK 5之前,Java主要依赖`synchronized`关键字来保证线程...