top / index / prev / next / target / source

2007-01-13 diary: シンプルなスレッドローカルを利用したサンプル

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

シンプルなスレッドローカルを利用したサンプル

java.lang.ThreadLocalを利用した簡単なサンプルが欲しかったので簡単に自作しました。

シンプルなスレッドローカルを利用したサンプル

java.lang.ThreadLocalを利用した簡単なサンプルが欲しかったので簡単に自作しました。

java.sql.Connectionの格納・取り出しなどに応用できるかと思っています。

懸念事項ですが、synchronizedを利用しているため、多重度の高い環境でスループットが維持できるのかどうかが懸念事項です。しかし synchronized無しで (アトミックに) 動作するのかについて、いまいち理解/解読できていません。 DateInstanceThreadLocal.java

/**
 * すごく単純な、Dateインスタンスをスレッドローカルに記憶しておくためのサンプルプログラム。
 * Copyright (C) 2007 いがぴょん
 */
import java.util.Date;

/**
 * Dateインスタンスをスレッドローカルに記憶するためのクラス
 * 
 * このクラスはJDK 1.4をターゲットとしているので ThreadLocalのremoveは利用していません。
 * 
 * @author IGA Tosiki
 */
public class DateInstanceThreadLocal {
    /**
     * インスタンスを記憶しておくために利用するスレッドローカル。
     * 
     * ※static変数である点に注意。
     */
    private static final ThreadLocal fThreadLocal = new ThreadLocal();

    /**
     * スレッドローカルにオブジェクトをセットします。
     * 
     * そのスレッドにおいて一通りの処理が終わった際には、このメソッドを 引数 null で呼び出してください。
     * 
     * @param argDate
     *            記憶させたい日付インスタンス。利用を終えた場合にはnullをセットして呼び出してください。
     */
    public static final void setDate(final Date argDate) {
        synchronized (fThreadLocal) {
            fThreadLocal.set(argDate);
        }
    }

    /**
     * スレッドローカルからコネクションを取得します。
     * 
     * @return
     */
    public static final Date getDate() {
        synchronized (fThreadLocal) {
            if (fThreadLocal.get() == null) {
                // オブジェクトは結び付けられていません。nullを戻します。
                return null;
            }

            if (fThreadLocal.get() instanceof Date == false) {
                throw new IllegalArgumentException("想定外の状況が発生。対応しないクラス["
                        + fThreadLocal.get().getClass().toString()
                        + "]のインスタンス[" + fThreadLocal.get().toString()
                        + "]が格納されています。");
            }

            return (Date) fThreadLocal.get();
        }
    }
}

この日記について