sun.misc.Unsafe 线程安全吗?

Is sun.misc.Unsafe thread safe?

sun.misc.UnsafetheUnsafe 实例线程安全吗?

Unsafe 的方法不是线程安全的。您需要像往常一样同步访问您想要自己操作的数据。然而,访问实例 theUnsafe 是因为在加载 class 时字段会被初始化(它是静态的)。

接受的答案如果没有错,至少会产生误导。

在 Java 级别,Unsafe 不包含任何实例状态。它的大多数方法调用本机代码,这些代码要么不适用于任何共享可变状态,要么调用本机分配器到 allocate/free 内存,并且这些操作是线程安全的(通常你不会同步调用 new 例如 C++)。 OTOH,sun.misc.Unsafe 是内部的 API,其合同未记录在案,可能会更改。

是否需要同步对 Unsafe 实例上方法的调用?这取决于您是否可能将与参数相同的地址传递给这些方法。与调用以下 Java class 的 addItem 方法相同,如果您从不同线程向它传递相同的列表,则需要同步。

class ListUtils {
  public static void addItem(List<Object> list, Object obj) { list.add(obj); }
}

// Good:
// thread1:
List<Object> l1 = new List<>();
ListUtils.addItem(l1, 1);
// thread2:
List<Object> l2 = new List<>();
ListUtils.addItem(l2, 2);

// Needs synchronization:
class SharedState {
   public static List<Object> sharedList = new List<>();
}
// thread1:
ListUtils.addItem(SharedState.sharedList, 1);
// thread2:
ListUtils.addItem(SharedState.sharedList, 2);

我不会说 ListUtils 不是线程安全的。它不携带任何可变的和潜在的共享状态。是的,同步 addItem 方法将消除第二个示例中的同步需求,但这将不必要地同步使用完全不同数据的操作。