Tag: 比较和交换

任何人都可以将这个C ++代码(从OpenJDK6)解释为普通英语吗?

这是OpenJDK6的hotspot/src/share/vm/prims/unsafe.cpp的代码片段(从第1082行开始): // JSR166 —————————————————————— 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 […]

在Java中,AtomicInteger compareAndSet()与synchronized关键字的性能如何?

我正在实现请求实例的FIFO队列(预分配的请求对象以提高速度),并在add方法上使用“synchronized”关键字开始。 该方法非常短(检查固定大小缓冲区中的空间,然后向数组添加值)。 使用visualVM看起来线程比我喜欢的更频繁地阻塞(“监视器”是精确的)。 所以我将代码转换为使用AtomicInteger值,例如跟踪当前大小,然后在while循环中使用compareAndSet()(因为AtomicInteger在内部为incrementAndGet()等方法执行)。 现在代码看起来要长一些。 我想知道的是使用synchronized和更短代码的性能开销与没有synchronized关键字的更长代码相比(因此永远不应该阻塞锁)。 这是使用synchronized关键字的旧get方法: public synchronized Request get() { if (head == tail) { return null; } Request r = requests[head]; head = (head + 1) % requests.length; return r; } 这是没有synchronized关键字的新get方法: public Request get() { while (true) { int current = size.get(); if (current <= 0) { return null; } if […]