`
fuhuijun
  • 浏览: 32070 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于Unsafe中的compareAndSwap方法实例

阅读更多
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方法是原子的,故可用来实现高性能的、无锁的数据结构

 

分享到:
评论

相关推荐

    Java中unsafe操作实例总结

    compareAndSwap操作是Unsafe类中最重要的操作之一,它可以实现原子操作,保证了多线程环境下的线程安全。compareAndSwap操作可以分为三步: 1. 获取obj对象中offset偏移值的当前值,假设为realVal 2. 比较realVal和...

    JDK Unsafe 源码注释

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

    一篇看懂Java中的Unsafe类

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

    Java Unsafe类的使用.docx

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

    简单谈一谈Java中的Unsafe类

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

    深入分析Java并发编程之CAS

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

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

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

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

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

    Java CAS底层实现原理实例详解

    Java CAS(Compare And Swap)是一种机制,用于解决多线程并行情况下使用锁造成性能损耗的问题。CAS 的概念是,比较并交换,解决多线程并行情况下使用锁造成性能损耗的一种机制。CAS(V, A, B),V为内存地址、A为...

    Java多线程和并发知识整理

    CAS(Compare and Swap)无锁算法,基于硬件支持,用于原子操作。Unsafe类提供了直接内存访问和CAS操作。 **11. JUC锁: LockSupport详解** LockSupport是线程阻塞和唤醒的基础,用于构建锁和其他同步组件。 以上内容...

    今天会是有Offer的一天么:面试时不要再问我CAS和Synchronized的区别了

    在Java并发编程中,CAS(Compare And Swap)和synchronized都是用来保证线程安全的重要机制,但它们的工作原理和应用场景有所不同。 **CAS(Compare And Swap)** 1. **什么是CAS**:CAS是一种无锁算法,通过比较并...

    Java进阶知识点汇总.pdf

    - `AtomicInteger`使用了CAS(Compare and Swap)机制来实现原子更新操作,确保了线程安全性。 - CAS是一种乐观锁机制,通过比较预期值与当前值来决定是否进行更新,如果预期值与当前值相同则更新成功,否则失败并尝试...

    Java多线程CAS操作原理代码实例解析

    这些类提供了一些原子操作,如incrementAndGet()、compareAndSet()等,这些操作都是CAS操作的实现。 下面是使用AtomicInteger类实现CAS操作的示例代码: ```java public class T03_AtomicInteger { AtomicInteger ...

    java面试常见基础(深层次,高级研发)

    - **CAS**:Compare And Swap,比较并交换。 - **AtomicInteger**:利用CAS实现原子操作。 ##### 13.1 Unsafe `Unsafe`类提供了对底层操作的支持,如内存访问和操作。 ##### 13.2 CAS CAS是一种无锁算法,用于...

    2019年一线互联网公司Java高级面试题总结

    - **CAS** (Compare and Swap): 是一种无锁编程技术,用于原子更新变量值。 - **实现**: - 通过`Unsafe`类的`compareAndSwapInt`等方法实现。 #### 10. 单例模式 - **实现方法**: - 饿汉式(静态常量)、懒汉式...

Global site tag (gtag.js) - Google Analytics