top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
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();
}
}
}