sun.misc.Unsafe 线程安全吗?
Is sun.misc.Unsafe thread safe?
sun.misc.Unsafe
或 theUnsafe
实例线程安全吗?
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
方法将消除第二个示例中的同步需求,但这将不必要地同步使用完全不同数据的操作。
sun.misc.Unsafe
或 theUnsafe
实例线程安全吗?
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
方法将消除第二个示例中的同步需求,但这将不必要地同步使用完全不同数据的操作。