import java.lang.reflect.Field; import sun.misc.Unsafe; /** * @author fhj * @date 2018年5月7日 下午4:16:21 * @version <b>1.0.0</b> */ public class CompareAndSwap { private static final Unsafe unsafe; private static final long fieldOffset; static { try { Class<?> clazz = User.class; unsafe = getUnsafe(); fieldOffset = unsafe.objectFieldOffset(clazz.getDeclaredField("age"));//获取User中age字段在内存中的偏移量 } catch (Exception ex) { throw new Error(ex); } } /** * boolean sun.misc.Unsafe.compareAndSwapInt(Object arg0, long arg1, int arg2, int arg3) * @param arg0-比较的对象 * @param arg1-需要修改的字段内存偏移量 * @param arg2-期待值(对比参考值) * @param arg3-修改的值 * 描述:argo对象中arg1偏移量指向的字段值如果等于arg2,则将arg1偏移量指向的字段值改为arg3,返回true * 否则不做任何操作,返回false */ public static void main(String[] args) { User user = new User(10); try { Boolean result; result = unsafe.compareAndSwapInt(user, fieldOffset, 10, 12); System.out.println(result);//true System.out.println(user.getAge());//12 result = unsafe.compareAndSwapInt(user, fieldOffset, 10, 14); System.out.println(result);//false System.out.println(user.getAge());//12 result = unsafe.compareAndSwapInt(user, fieldOffset, 12, 14); System.out.println(result);//true System.out.println(user.getAge());//14 } catch (Exception ex) { ex.printStackTrace(); } } /** * 通过代码反射获取Unsafe静态类 * 直接通过Unsafe.getUnsafe()获取会抛安全性异常 */ private static Unsafe getUnsafe() { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); Unsafe unsafe = (Unsafe) field.get(null); return unsafe; } catch (Exception ex) { throw new Error(ex); } } static class User { private int age; User(int age) { this.age = age; } public int getAge() { return age; } } }
总结:因Unsafe类中的compareAndSwap方法是原子的,故可用来实现高性能的、无锁的数据结构
相关推荐
compareAndSwap操作是Unsafe类中最重要的操作之一,它可以实现原子操作,保证了多线程环境下的线程安全。compareAndSwap操作可以分为三步: 1. 获取obj对象中offset偏移值的当前值,假设为realVal 2. 比较realVal和...
虽然Oracle发行的JDK版本不包含Unsafe的源代码,但在并发编程中,Unsafe类为java.util.concurrent包里的类提供了底层支持,例如通过提供绕过JVM直接修改内存的能力和使用硬件CPU指令实现CAS(Compare-And-Swap)原子...
2. **CAS(Compare and Swap)操作**:在并发编程中,`Unsafe`提供了原子性的CAS操作,通过内存偏移地址修改变量值。例如,`SynchronousQueue`中的`TransferStack`使用CAS更新栈顶节点。 ```java private static ...
而CAS(Compare and Swap,比较并交换)算法的引入,提供了无锁编程的可能性。CAS操作包含三个参数:内存地址、预期值和新值。当预期值与内存地址当前的值相匹配时,才会更新内存地址的值为新值,整个过程是原子性的...
- `compareAndSwap*`、`getAndSet*`等原子操作:用于并发编程,提供类似锁的效果,但性能更高。 4. **线程操作**: - `park`和`unpark`:控制线程的暂停和恢复,可用于自定义同步原语。 - `getThreadParkBlocker...
public void compareAndSwap(int expectedValue, int newValue) { while (true) { int currentValue = state; if (currentValue == expectedValue) { if (unsafe.compareAndSwapInt(this, stateOffset, ...
`Unsafe`类包含了一些多线程同步的机制,如锁操作和CAS(Compare and Swap)操作。虽然`monitorEnter`、`tryMonitorEnter`和`monitorExit`已不建议使用,但`compareAndSwapInt`等CAS方法是无锁编程的关键,广泛应用于`...
根据提供的文件信息,可以看出这份资料主要关注的是Java中与多线程相关的高级同步机制,特别是CAS(Compare and Swap)操作、自旋锁以及Unsafe类的使用。下面将详细阐述这些概念及其应用场景。 ### CAS (Compare ...
Java CAS(Compare And Swap)是一种机制,用于解决多线程并行情况下使用锁造成性能损耗的问题。CAS 的概念是,比较并交换,解决多线程并行情况下使用锁造成性能损耗的一种机制。CAS(V, A, B),V为内存地址、A为...
CAS(Compare and Swap)无锁算法,基于硬件支持,用于原子操作。Unsafe类提供了直接内存访问和CAS操作。 **11. JUC锁: LockSupport详解** LockSupport是线程阻塞和唤醒的基础,用于构建锁和其他同步组件。 以上内容...
在Java并发编程中,CAS(Compare And Swap)和synchronized都是用来保证线程安全的重要机制,但它们的工作原理和应用场景有所不同。 **CAS(Compare And Swap)** 1. **什么是CAS**:CAS是一种无锁算法,通过比较并...
- `AtomicInteger`使用了CAS(Compare and Swap)机制来实现原子更新操作,确保了线程安全性。 - CAS是一种乐观锁机制,通过比较预期值与当前值来决定是否进行更新,如果预期值与当前值相同则更新成功,否则失败并尝试...
这些类提供了一些原子操作,如incrementAndGet()、compareAndSet()等,这些操作都是CAS操作的实现。 下面是使用AtomicInteger类实现CAS操作的示例代码: ```java public class T03_AtomicInteger { AtomicInteger ...
- **CAS**:Compare And Swap,比较并交换。 - **AtomicInteger**:利用CAS实现原子操作。 ##### 13.1 Unsafe `Unsafe`类提供了对底层操作的支持,如内存访问和操作。 ##### 13.2 CAS CAS是一种无锁算法,用于...
- **CAS** (Compare and Swap): 是一种无锁编程技术,用于原子更新变量值。 - **实现**: - 通过`Unsafe`类的`compareAndSwapInt`等方法实现。 #### 10. 单例模式 - **实现方法**: - 饿汉式(静态常量)、懒汉式...