定义:
thread-specific stroage模式 是一种即使只有一个入口,也会在内部为每个线程分配特定的空间的模式
引例:
不用thread-specific stroage模式 的实例
public class Log {
private static PrintWriter writer = null;
// 初始化writer字段
static {
try {
writer = new PrintWriter(new FileWriter("log.txt"));
} catch (IOException e) {
e.printStackTrace();
}
}
// 加入一笔log
public static void println(String s) {
writer.println(s);
}
// 关闭log
public static void close() {
writer.println("==== End of log ====");
writer.close();
}
}
public class Main {
public static void main(String[] args) {
System.out.println("BEGIN");
for (int i = 0; i < 10; i++) {
Log.println("main: i = " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
Log.close();
System.out.println("END");
}
}
用thread-specific stroage模式 的实例
public class Log {
private static final ThreadLocal tsLogCollection = new ThreadLocal();
// 加入一个log
public static void println(String s) {
getTSLog().println(s);
}
// 关闭log
public static void close() {
getTSLog().close();
}
// 取得线程特有的log
private static TSLog getTSLog() {
TSLog tsLog = (TSLog)tsLogCollection.get();
//如果线程是第一次呼叫,就建立新挡案并登陆log
if (tsLog == null) {
tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt");
tsLogCollection.set(tsLog);
}
return tsLog;
}
}
public class TSLog {
private PrintWriter writer = null;
// 初始化writer字段
public TSLog(String filename) {
try {
writer = new PrintWriter(new FileWriter(filename));
} catch (IOException e) {
e.printStackTrace();
}
}
// 加入一笔log
public void println(String s) {
writer.println(s);
}
// 关闭log
public void close() {
writer.println("==== End of log ====");
writer.close();
}
}
public class ClientThread extends Thread {
public ClientThread(String name) {
super(name);
}
public void run() {
System.out.println(getName() + " BEGIN");
for (int i = 0; i < 10; i++) {
Log.println("i = " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
Log.close();
System.out.println(getName() + " END");
}
}
public class Main {
public static void main(String[] args) {
new ClientThread("Alice").start();
new ClientThread("Bobby").start();
new ClientThread("Chris").start();
}
}
thread-specific stroage模式 出现的角色:
client(委托者):client角色將处理委托给tsobjectporxy角色
tsobjectporxy(线程特有的对象的代理人):tsobjectporxy角色会执行多个client角色委托给他处理
tsobjectcollection(线程特有的对象集合):tsobjectcollection角色有一张client与client角色对应表。
tsobject(线程特有的对象):tsobject角色保存着线程特有的信息。