1

oracle.sql.ArrayDescriptor のインスタンスはスレッドセーフですか?

このクラスの API http://docs.oracle.com/cd/E16338_01/appdev.112/e13995/oracle/sql/ArrayDescriptor.htmlは、スレッドの安全性について何も言及していません。

4

2 に答える 2

2

javapクラスでコマンドを実行しoracle.sql.ArrayDescriptorています .. クラスのパブリック メソッドoracle.sql.ArrayDescriptorが同期されていないことがわかります。javap が伝える内容は次のとおりです。

E:\users>javap oracle.sql.ArrayDescriptor
Compiled from "ArrayDescriptor.java"
public class oracle.sql.ArrayDescriptor extends oracle.sql.TypeDescriptor implem
ents java.io.Serializable{
    public static final int TYPE_VARRAY;
    public static final int TYPE_NESTED_TABLE;
    public static final int CACHE_NONE;
    public static final int CACHE_ALL;
    public static final int CACHE_LAST;
    static final long serialVersionUID;
    public static final boolean TRACE;
    public static final boolean PRIVATE_TRACE;
    public static final java.lang.String BUILD_DATE;
    public static oracle.sql.ArrayDescriptor createDescriptor(java.lang.String, java.sql.Connection) throws java.sql.SQLException;
    public static oracle.sql.ArrayDescriptor createDescriptor(java.lang.String, java.sql.Connection, boolean, boolean) throws java.sql.SQLException;
    public static oracle.sql.ArrayDescriptor createDescriptor(oracle.sql.SQLName,  java.sql.Connection) throws java.sql.SQLException;
    public static oracle.sql.ArrayDescriptor createDescriptor(oracle.sql.SQLName, java.sql.Connection, boolean, boolean) throws java.sql.SQLException;
    public static oracle.sql.ArrayDescriptor createDescriptor(oracle.jdbc.oracore.OracleTypeCOLLECTION) throws java.sql.SQLException;
    public oracle.sql.ArrayDescriptor(java.lang.String, java.sql.Connection) throws java.sql.SQLException;
    public oracle.sql.ArrayDescriptor(oracle.sql.SQLName, java.sql.Connection) throws java.sql.SQLException;
    public oracle.sql.ArrayDescriptor(oracle.sql.SQLName, oracle.jdbc.oracore.OracleTypeCOLLECTION, java.sql.Connection) throws java.sql.SQLException;
    public oracle.sql.ArrayDescriptor(oracle.jdbc.oracore.OracleTypeCOLLECTION, java.sql.Connection) throws java.sql.SQLException;
    static oracle.sql.ArrayDescriptor createDescriptor(oracle.sql.SQLName, byte[], int, byte[], byte[], oracle.jdbc.internal.OracleConnection, byte[]) throws java.sql.SQLException;
    public int getBaseType() throws java.sql.SQLException;
    public java.lang.String getBaseName() throws java.sql.SQLException;
    public oracle.jdbc.oracore.OracleTypeCOLLECTION getOracleTypeCOLLECTION();
    public int getArrayType() throws java.sql.SQLException;
    public long getMaxLength() throws java.sql.SQLException;
    public java.lang.String descType()  throws java.sql.SQLException;
    java.lang.String descType(java.lang.StringBuffer, int) throws java.sql.SQLException;
    int toLength(oracle.sql.ARRAY) throws java.sql.SQLException;
    byte[] toBytes(oracle.sql.ARRAY, boolean) throws java.sql.SQLException;
    oracle.sql.Datum[] toOracleArray(oracle.sql.ARRAY, long, int, boolean) throws java.sql.SQLException;
    java.lang.Object[] toJavaArray(oracle.sql.ARRAY, long, int, java.util.Map, boolean) throws java.sql.SQLException;
    public java.sql.ResultSet toResultSet(oracle.sql.ARRAY, long, int, java.util.Map, boolean) throws java.sql.SQLException;
    public java.sql.ResultSet toResultSet(oracle.sql.Datum[], long, int, java.util.Map) throws java.sql.SQLException;
    public java.sql.ResultSet toResultSetFromLocator(byte[], long, int, java.util.Map) throws java.sql.SQLException;
    public java.sql.ResultSet toResultSetFromImage(oracle.sql.ARRAY, long, int, java.util.Map) throws java.sql.SQLException;
    public static java.lang.Object[] makeJavaArray(int, int) throws java.sql.SQLException;
    oracle.sql.Datum[] toOracleArray(java.lang.Object, long, int) throws java.sql.SQLException;
    java.lang.Object toNumericArray(oracle.sql.ARRAY, long, int, int, boolean) throws java.sql.SQLException;
    public int getTypeCode() throws java.sql.SQLException;
    public byte[] toBytes(oracle.sql.Datum[]) throws java.sql.SQLException;
    public byte[] toBytes(java.lang.Object[]) throws java.sql.SQLException;
    public int length(byte[]) throws java.sql.SQLException;
    public oracle.sql.Datum[] toArray(byte[]) throws java.sql.SQLException;
    public oracle.sql.Datum[] toArray(java.lang.Object) throws java.sql.SQLException;
    public java.sql.ResultSet toResultSet(byte[], java.util.Map) throws java.sql.SQLException;
    public java.sql.ResultSet toResultSet(byte[], long, int, java.util.Map) throws java.sql.SQLException;
    public static int getCacheStyle(oracle.sql.ARRAY) throws java.sql.SQLException;
    static {};
}

したがって、このクラスはスレッドセーフではないと仮定して、このクラスを続行する必要があります。

更新
クラスのすべてのプライベート変数とパブリック変数は最終的なため、インスタンスの内部状態がそのメソッドによって変更されることはありません。ただし、以下に示すように、非最終変数を含むoracle.sql.ArrayDescriptor継承も行います。oracle.sql.TypeDescriptor

E:\users>javap -private oracle.sql.TypeDescriptor
Compiled from "TypeDescriptor.java"
public abstract class oracle.sql.TypeDescriptor extends java.lang.Object implements java.io.Serializable{
    public static boolean DEBUG_SERIALIZATION;
    static final long serialVersionUID;
    oracle.sql.SQLName sqlName;
    oracle.jdbc.oracore.OracleNamedType pickler;
    transient oracle.jdbc.internal.OracleConnection connection;
    private static final java.lang.String _Copyright_2004_Oracle_All_Rights_Reserved_;
    public static final boolean TRACE;
    public static final boolean PRIVATE_TRACE;
    public static final java.lang.String BUILD_DATE;
    protected oracle.sql.TypeDescriptor();
    protected oracle.sql.TypeDescriptor(java.lang.String, java.sql.Connection)throws java.sql.SQLException;
    protected oracle.sql.TypeDescriptor(oracle.sql.SQLName, java.sql.Connection)throws java.sql.SQLException;
    protected oracle.sql.TypeDescriptor(oracle.sql.SQLName, oracle.jdbc.oracore.OracleTypeADT, java.sql.Connection)throws java.sql.SQLException;
    protected oracle.sql.TypeDescriptor(oracle.jdbc.oracore.OracleTypeADT, java.sql.Connection)throws java.sql.SQLException;
    public synchronized java.lang.String getName() throws java.sql.SQLException;
    public synchronized oracle.sql.SQLName getSQLName() throws java.sql.SQLException;
    void initSQLName()       throws java.sql.SQLException;
    public java.lang.String getSchemaName()       throws java.sql.SQLException;
    public java.lang.String getTypeName()       throws java.sql.SQLException;
    public oracle.jdbc.oracore.OracleNamedType getPickler();
    public oracle.jdbc.internal.OracleConnection getInternalConnection();
    public void setPhysicalConnectionOf(java.sql.Connection);
    public abstract int getTypeCode()       throws java.sql.SQLException;
    public static oracle.sql.TypeDescriptor getTypeDescriptor(java.lang.String,oracle.jdbc.OracleConnection) throws java.sql.SQLException;
    public static oracle.sql.TypeDescriptor getTypeDescriptor(java.lang.String,oracle.jdbc.OracleConnection, byte[], long) throws java.sql.SQLException;
    public boolean isInHierarchyOf(java.lang.String) throws java.sql.SQLException;
    private void writeObject(java.io.ObjectOutputStream)throws java.io.IOException;
    private void readObject(java.io.ObjectInputStream)throws java.io.IOException, java.lang.ClassNotFoundException;
    public void setConnection(java.sql.Connection) throws java.sql.SQLException;
    public static java.lang.String getSubtypeName(oracle.jdbc.OracleConnection,byte[], long) throws java.sql.SQLException;
    public void initMetadataRecursively()       throws java.sql.SQLException;
    public void initNamesRecursively()       throws java.sql.SQLException;
    public void fixupConnection(oracle.jdbc.internal.OracleConnection) throws java.sql.SQLException;
    public java.lang.String toXMLString()       throws java.sql.SQLException;
    public void printXML(java.io.PrintStream)       throws java.sql.SQLException;
    void printXML(java.io.PrintWriter, int)       throws java.sql.SQLException;
    void printXMLHeader(java.io.PrintWriter)       throws java.sql.SQLException;
    static {};
}

oracle.sql.ArrayDescriptorしたがって、クラスの同じオブジェクトにアクセスするさまざまなスレッドによって、これらの非最終変数が予期せず変更される可能性があります。だから私はまだそうではないと思いますThread-safe

于 2013-03-29T15:39:50.600 に答える
1

何だと思う?ソースコードは、通常の場所では入手できないようです。そのため、確実に知る方法はありません... Oracleサポートに問い合わせる以外は.

API 設計に基づいて、スレッドセーフになる可能性があります。セッターはなく、クラスはクライアントの観点から不変であるように意図されているようです。javapこれは、バイトコード ファイルをポイントして、インスタンス変数がすべて として宣言されているかどうかを確認することで確認できますfinal

ただし、確認が取れない場合は、クラスがスレッドセーフではないと想定するのが安全な方法です。

于 2013-03-29T15:27:23.197 に答える