Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以使用不安全的。将DSWAP与内存位置进行比较,而不是与对象进行偏移?_Java - Fatal编程技术网

Java 是否可以使用不安全的。将DSWAP与内存位置进行比较,而不是与对象进行偏移?

Java 是否可以使用不安全的。将DSWAP与内存位置进行比较,而不是与对象进行偏移?,java,Java,大多数不安全操作都接受内存位置以执行操作,例如: Unsafe unsafe = Context.unsafe; long position = unsafe.allocateMemory(8); unsafe.putLong(position, 0); 但是,据我所知,CAS操作并没有提供这一点,而是将对象作为参数之一: unsafe.compareAndSwapLong(this, offset, expected, newvalue) 但是,考虑到位于“

大多数不安全操作都接受内存位置以执行操作,例如:

    Unsafe unsafe = Context.unsafe;
    long position = unsafe.allocateMemory(8);
    unsafe.putLong(position, 0);
但是,据我所知,CAS操作并没有提供这一点,而是将对象作为参数之一:

    unsafe.compareAndSwapLong(this, offset, expected, newvalue)

但是,考虑到位于“位置”的long字段,我如何执行CAS操作而不将其作为对象中的字段?

根据以下文档:

从给定Java变量获取值。 更具体地说,获取给定数组中的字段或数组元素 在给定偏移量处的对象o,或(如果o为 null)从其数值为给定值的内存地址 抵消

可能(我没有亲自测试过)这同样适用于
compareAndSwapLong
,因此您可以尝试将
null
传入
o
并将
偏移量设置为内存地址


深入本机代码,比较
compareAndSwapLong

getInt



两者都使用
JNIHandles::resolve(obj)
,因此它们可能使用相同的空对象处理逻辑。

有趣的是,我需要做更多的实验——我最初认为这是问题所在,因为Unsafe.CompareAndSwapLong始终返回false(如您所建议的那样使用null)。稍后我会再给它一次机会。这很有效,我是个笨蛋,在做之前不小心改变了内存位置(具有类似名称的函数)
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x))

UnsafeWrapper("Unsafe_CompareAndSwapLong");
  Handle p (THREAD, JNIHandles::resolve(obj));
  jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
  ...
#define GET_FIELD(obj, offset, type_name, v) \
  oop p = JNIHandles::resolve(obj); \
  type_name v = *(type_name*)index_oop_from_field_offset_long(p, offset)