簡體   English   中英

Java反射中的構造函數類線程安全

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM