この記事では、Java の ThreadLocal について詳しく紹介 (コード例) しています。一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。
ThreadLocal は基本的にプロジェクト開発では使用されませんが、面接官はこの種の質問を好むため、このクラスの機能と原理を理解しておく必要があります。
ThreadLocal とは
ThreadLocal は、複数のスレッドのスレッドごとに変数の個別のコピーを作成するクラスです。ThreadLocal を使用して変数を維持する場合、ThreadLocal は、複数のスレッドによって引き起こされるデータの不整合を避けるために、スレッドごとに変数の個別のコピーを作成します。共有変数のスレッド操作;
一般的に、ThreadLocal
は実際の工業生産では使用されません。一般的ですが、多くのフレームワークで使用すると、いくつかのフレームワークの問題を解決できます。たとえば、Spring のトランザクション、Spring のスコープ Scope
、Request の Bean
は、ThreadLocal.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConnectionFactory { private static final ThreadLocal<Connection> dbConnectionLocal = new ThreadLocal<Connection>() { @Override protected Connection initialValue() { try { return DriverManager.getConnection("", "", ""); } catch (SQLException e) { e.printStackTrace(); } return null; } }; public Connection getConnection() { return dbConnectionLocal.get(); } }
#ThreadLocal がスレッドを実装する方法isolation
スレッドへの変数は次のとおりです:
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); }
1. まず現在の Thread オブジェクト t を取得し、次にスレッド t から ThreadLocalMap のメンバー属性 threadLocals
# を取得します。現在のスレッドが初期化されており (つまり、null ではなく)、現在の ThreadLocal オブジェクトをキーとして持つ値がある場合は、現在のスレッドによって取得されるオブジェクト (この例では Connection) を直接返します。
3. 現在のスレッドの threadLocals が初期化されている (つまり、null ではない) が、現在の ThreadLocal オブジェクトをキーとして持つオブジェクトがない場合は、Connection オブジェクトを再作成し、それを threadLocals に追加します。現在のスレッドのマップを返し、4 を返します。現在のスレッドの threadLocals プロパティが初期化されていない場合は、ThreadLocalMap オブジェクトを再作成し、Connection オブジェクトを作成して ThreadLocalMap オブジェクトに追加して返します。 存在する場合は、直接返されます。理解するのは簡単です。それでは、初期化方法のコードは何ですか?private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; }
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
public Connection getConnection() { Connection connection = dbConnectionLocal.get(); if (connection == null) { try { connection = DriverManager.getConnection("", "", ""); dbConnectionLocal.set(connection); } catch (SQLException e) { e.printStackTrace(); } } return connection; }
# を継承します。 ##4. このメソッドは、キーと値を保存するためにエントリ配列のみを使用します。エントリはリンク リストの形式ではなく、各バケットに 1 つのエントリだけが配置されます。
以上がJava での ThreadLocal の詳細な紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。