`
weigang.gao
  • 浏览: 491877 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java Unsafe类的compareAndSwap方法

 
阅读更多

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

  • 大小: 6.3 KB
分享到:
评论

相关推荐

    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操作实例总结

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

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

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

    简单谈一谈Java中的Unsafe类

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

    JDK Unsafe 源码注释

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

    探秘Java并发:Atomic&Unsafe的强大魔法

    这些类的实现依赖于底层硬件的CAS(Compare-And-Swap)操作,确保多线程环境下的数据安全。Unsafe类的功能:Unsafe类作为Java的隐藏秘密,提供底层内存控制和其他高级操作。它允许直接访问和修改内存,操作类和对象...

    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`关键字来保证线程...

Global site tag (gtag.js) - Google Analytics