【发布时间】:2021-08-07 14:05:19
【问题描述】:
我想知道是否有任何方法可以使用Unsafe,更准确地说是compareAndSwapObject,对 Java 中的静态字段执行比较和交换操作。我尝试使用 null 和类对象 (TheClass.class) 作为第一个参数,但没有成功。
编辑: 代码如下:
public class UnsafeTest
{
public static long staticField = 0;
public static void main(String[] args) throws Exception
{
Long l = 0L;
Long res = 350L;
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
long off = unsafe.staticFieldOffset(
UnsafeTest.class.getDeclaredField("staticField"));
unsafe.compareAndSwapObject(UnsafeTest.class, off, l, res);
// null instead of UnsafeTest.class produces the same result
Thread.sleep(1000L);
System.out.println(staticField); // prints 0
}
}
我希望它在字段staticField 上执行 CAS,将其设置为 350(任意值)。发生了什么:在标准输出上打印它的值时,它显示为 0;所以我想什么都没有改变,而且这些都不是做我想做的事情的正确论据,假设这是可能的。
提前谢谢你!
【问题讨论】:
标签: java concurrency jvm compare-and-swap