sun.misc.Unsafe
或theUnsafe
实例线程安全吗?
答案 0 :(得分:4)
Unsafe
的方法不是线程安全的。您需要同步访问您想要自己操作的数据 - 像往常一样。然而,访问实例theUnsafe
是因为在加载类时该字段被初始化(它是静态的)。
答案 1 :(得分:2)
可接受的答案至少是正确的,即使没有错。
在Java级别,Unsafe
不保留任何实例状态。它的大多数方法都调用本机代码,该代码不能与任何共享的可变状态一起使用,或者调用本机分配器来分配/释放内存,并且这些操作是线程安全的(通常您不同步对new
的调用例如C ++)。 OTOH,sun.misc.Unsafe
是内部API,其合同未记录在案,并且可能会更改。
是否需要同步对Unsafe
实例上的方法的调用?这取决于您是否要传递与这些方法的参数相同的地址。如果要从不同的线程传递相同的列表,则需要与对以下Java类的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
方法将消除同步的需要,但是不必要地同步正在处理完全不同的数据的操作。