java - 是否可以将 Unsafe.CompareAndSwap 与内存位置而不是对象的偏移量一起使用?

标签 java

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

    Unsafe unsafe = Context.unsafe;
    long position = unsafe.allocateMemory(8);
    unsafe.putLong(position, 0);

但是,据我所知,CAS 操作不提供此功能 - 它们而是将对象作为参数之一:

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

但是,考虑到位于“position”位置的 long,如何在它不是对象内的字段的情况下执行 CAS 操作?

最佳答案

根据Unsafe.getInt(Object o, long offset)的文档:

Fetches a value from a given Java variable. More specifically, fetches a field or array element within the given object o at the given offset, or (if o is null) from the memory address whose numerical value is the given offset.

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

<小时/>

深入研究 native 代码,比较 compareAndSwapLongcode :

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));
  ...

getIntcode :

#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)
<小时/>

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

关于java - 是否可以将 Unsafe.CompareAndSwap 与内存位置而不是对象的偏移量一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022412/

相关文章:

Java如何用多个双引号分割字符串

java - 关闭 HtmlUnit 的 log4j 记录器

java - GSS-API MSSQL JDBC 驱动程序

Java-获取 IndexOutOfBoundsException

java - 在 Hadoop 中选择不同的记录并使用组合器

java - 如何在网页中搜索字词

java - 设置属性值时出错;嵌套异常是 org.springframework.beans.NotWritablePropertyException :

Java正则表达式,匹配数学表达式中的变量

JavaFX - 为什么按钮有时会缩小?

java - 如何在 Android 中安排通知