java 原子操作在x86下的实现
2011-06-26 23:29
274 查看
JVM 6里面可以看到很多的CAS的操作,而我们来看看JVM里面是怎么实现CAS的操作,至于原子操作的语义在这里我们就不介绍了
核心java源码是unsafe.java
compareAndSwapObject
compareAndSwapInt
compareAndSwapLong
。。。。
具体我们主要来看看 如何实现compareAndSwapObject的方法
unsafe.cpp
首先通过offset找到object 里的所要修改的field 的地址,接着就是在这个地址上内容交换,这里的要改变的内容实际上就是object的地址。
oopDesc::atomic_compare_exchange_oop
其中对压缩的object的地址重新计算,在opp.inline.hpp的文件中
让我们看看最后在x86里面linux下所调用的原子指令,在c++里面使用内联汇编,定义在atomic_linux_x86.include.hpp里
核心java源码是unsafe.java
compareAndSwapObject
compareAndSwapInt
compareAndSwapLong
。。。。
具体我们主要来看看 如何实现compareAndSwapObject的方法
unsafe.cpp
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) UnsafeWrapper("Unsafe_CompareAndSwapObject"); oop x = JNIHandles::resolve(x_h); oop e = JNIHandles::resolve(e_h); oop p = JNIHandles::resolve(obj); HeapWord* addr = (HeapWord *)index_oop_from_field_offset_long(p, offset); if (UseCompressedOops) { update_barrier_set_pre((narrowOop*)addr, e); } else { update_barrier_set_pre((oop*)addr, e); } oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e); jboolean success = (res == e); if (success) update_barrier_set((void*)addr, x); return success; UNSAFE_END
首先通过offset找到object 里的所要修改的field 的地址,接着就是在这个地址上内容交换,这里的要改变的内容实际上就是object的地址。
oopDesc::atomic_compare_exchange_oop
其中对压缩的object的地址重新计算,在opp.inline.hpp的文件中
inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) { assert(!is_null(v), "oop value can never be zero"); assert(check_obj_alignment(v), "Address not aligned"); assert(Universe::heap()->is_in_reserved(v), "Address not in heap"); address base = Universe::narrow_oop_base(); int shift = Universe::narrow_oop_shift(); uint64_t pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1)); assert(OopEncodingHeapMax > pd, "change encoding max if new encoding"); uint64_t result = pd >> shift; assert((result & CONST64(0xffffffff00000000)) == 0, "narrow oop overflow"); assert(decode_heap_oop(result) == v, "reversibility"); return (narrowOop)result; }
让我们看看最后在x86里面linux下所调用的原子指令,在c++里面使用内联汇编,定义在atomic_linux_x86.include.hpp里
inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) { bool mp = os::is_MP(); __asm__ __volatile__ (LOCK_IF_MP(%4) "cmpxchgq %1,(%3)" : "=a" (exchange_value) : "r" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp) : "cc", "memory"); return exchange_value; }
相关文章推荐
- 《Java并发编程的艺术》笔记四——Java如何实现原子操作.md
- Java实现原子操作的原理
- Java 并发编程笔记——使用循环cas实现原子操作
- java原子操作实现原理
- Java 原子操作的实现
- Java并发中原子操作的实现
- java并发实现原子操作
- Java多线程中实现原子操作的方法
- Java 并发 ---原子操作的实现原理
- java并发编程学习(三) 原子操作的实现原理及java中如何实现原子操作
- Java并发机制底层——原子操作的实现原理
- Java实现原子操作
- x86平台原子操作API的实现原理
- Java中如何实现原子操作?
- x86下的原子操作实现
- java原子操作的实现原理--转载
- java如何实现原子操作
- Java实现对MongoDB的AND、OR和IN操作
- JAVA实现excel表格导出,(IDEA 导入jar包操作)
- java执行序列化和反序列化操作实现对象的clone