[英]Constructor class thread safety in Java reflection
使用Java
反射 ,甚至可以通過私有構造函數實例化類的對象,例如對於
public class MyClass
{
private MyClass(Object p1, String p2)
{
// Constructor with no modifications to static code
}
}
一個人可以做(在相同或任何其他類中,為簡化起見,省略了異常處理)
public static final Constructor myClass;
static
{
myClass = MyClass.class.getConstructor(Object.class, String.class);
myClass.setAccessible(true);
}
然后創建新的MyClass
實例,例如
myClass.newInstance(new Object(), "Test");
鑒於myClass
是靜態的,上述對newInstance()
調用是否是線程安全的?
是的,只要類實例對對象的靜態上下文沒有執行任何非線程安全的操作,則類實例是靜態的,並且構造函數是線程安全的。
調用Constructor.newInstance()
似乎並不嚴格是線程安全的。 至少在我的OpenJDK-6實現我找到一類sun.reflect.NativeConstructorAccessorImpl
具有定義為一個場private int numInvocations;
以及稍后在此代碼行上: if (++numInvocations > ReflectionFactory.inflationThreshold()) {
-當然,它的行為可能與預期的一樣。
另外,在Constructor
類本身中,方法acquireConstructorAccessor()
記錄為“注意此處沒有使用同步”。
但是,狡猾的行為似乎並不會導致整體上的意外行為,只會重復/不必要地執行操作,因此,並行調用newInstance()
不會導致某些事情發生。
顯然,您仍然可以將實例構造函數中的操作弄亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.