java多线程之Thread-Specific Storage模式
一、Thread-Specific Storage模式
Specific是特定的意思,Storage模式是储存柜的意思,因为所谓Thread-Specific Storage就是“每个线程特有的储物柜”“为每个线程准备储存空间”的意思。
Thread-Specific Storage模式是一种即使只有一个入口,也会在内部为每个线程分配特有的储存空间的模式。
二、关于java.lang.ThreadLocal类(就是储物间)
将java.lang.ThreadLocal的实例当作一种集合可能会有助于理解它,也就是说ThreadLocal的实例会管理多个对象。
- set方法
ThreadLocal类的set方法用户将通过参数接收的实例与调用该方法的线程对应并存储起来,这里存储的对象可以通过get方法获取,set方法中没有表示线程的参数,set方法会先查询当前线程,然后以它作为键来存储实例。
调用set方法相当于将自己的行李放置到自己的存物柜中。
- get方法
ThreadLocal类的get方法用户获取与调用get方法的线程(当前线程)对应的实例,该线程之前通过set方法存储的实例就是get方法的返回值,如果之前一次都还没有调用过set方法,则get方法的返回值为null。
与set方法一样,get方法中也没有表示线程的参数,因为,get方法也会去查询当前线程,即get方法会以当前线程自身作为键去获取对象。
调用get方法相当于从自己的储物柜中取出自己的行李。
public class ThreadLocal<T> { //存储 public void set(T value) { ... } //获取 public T get() { ... } ...}
即通过ThreadLocal的T指定的类型就是set方法的参数的类型以及get方法的返回值的类型。
三、不使用Thread-Specific Storage模式示例程序
1.示例程序一览表
类名 | 说明 |
---|---|
Log.java | 创建日志的类 |
Main.java | 测试示例程序的类 |
2.示例程序的类图
3.Log类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson1;import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;/*** @Auther: viagra* @Date: 2019/11/19 20:22* @Description:*/
public class Log {/*** 是用于在名为log.txt的文件中记录程序运行记录的类。* writer字段中保存的是用于写文件的java.io.PrintWriter的实例。* println方法是用于将通过参数接收到的字符串写入到文件中的方法。* close方法是用于关闭日志文件的方法。*/private static PrintWriter writer = null;//初始化writer字段static {try {writer = new PrintWriter(new FileWriter("log.txt"));} catch (IOException e) {e.printStackTrace();}}//写日志public static void println(String s) {writer.println(s);}//关闭日志public static void close() {writer.println("===end of log===");writer.close();}
}
4.Main类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson1;/*** @Auther: viagra* @Date: 2019/11/19 20:22* @Description:*/
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(1000);} catch (InterruptedException e) {e.printStackTrace();}}Log.close();System.out.println("End");}
}
5.运行结果
Begin
End //for循环中设置的等待时间是1s,这里大约10s后显示
6.文件内容
main: i = 0
main: i = 1
main: i = 2
main: i = 3
main: i = 4
main: i = 5
main: i = 6
main: i = 7
main: i = 8
main: i = 9
===end of log===
7.示例程序的Timethreads图
四、使用Thread-Specific Storage模式示例程序
1.示例程序类的一览表
类名 | 说明 |
---|---|
TSLog.java | 创建日志的类(实例属于各个线程所有) |
Log.java | 创建日志的类(分配各个线程) |
java.lang.ThreadLocal | 分配线程特有的存储空间的类 |
ClientThread.java | 表示调用Log的线程的类 |
Main | 测试示例程序的类 |
2.示例程序的类图
3.TSLog类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson2;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;public class TSLog {private PrintWriter writer = null;//初始化writer字段public TSLog(String filename) {try {writer = new PrintWriter(new FileWriter(filename));} catch (IOException e) {e.printStackTrace();}}//写日志public void println(String s) {writer.println(s);}//关闭日志public void close() {writer.println("=== End of log ===");writer.close();}
}
4.Log类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson2;public class Log {private static final ThreadLocal<TSLog> tslogCollection = new ThreadLocal<TSLog>();//写日志public static void println(String s) {getTSLog().println(s);}//关闭日志public static void close() {getTSLog().close();}//获取线程特有的日志private static TSLog getTSLog() {TSLog tsLog = tslogCollection.get();//如果该线程是第一次调用本方法,就新生成并注册一个日志if (tsLog == null) {tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt");tslogCollection.set(tsLog);}return tsLog;}
}
5.ClientThread类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson2;/*** @Auther: viagra* @Date: 2019/11/19 20:22* @Description:*/
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(getName() + " i = " + i);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}Log.close();System.out.println(getName() + " End");}
}
6.Main类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson2;/*** @Auther: viagra* @Date: 2019/11/19 20:27* @Description:*/
public class Main {public static void main(String[] args) {new ClientThread("Steve Nash").start();new ClientThread("Michael Jordan").start();new ClientThread("Ronaldo").start();}
}
7.运行结果
Steve Nash Begin
Michael Jordan Begin
Ronaldo Begin
Michael Jordan End
Steve Nash End
Ronaldo End
//这里分别创建了Michael Jordan-log.txt、Ronaldo-log.txt、Steve Nash-log.txt
8.生成文件内容
//如Michael Jordan-log.txt
Michael Jordan i = 0
Michael Jordan i = 1
Michael Jordan i = 2
Michael Jordan i = 3
Michael Jordan i = 4
Michael Jordan i = 5
Michael Jordan i = 6
Michael Jordan i = 7
Michael Jordan i = 8
Michael Jordan i = 9
=== End of log ===
9.示例程序的Timethreads图
五、Thread-Specific Storage模式中角色
1.Client(委托者)
Client角色将处理委托给TSObjectProxy角色,一个TSObjectProxy角色会被多个Client角色使用,是示例程序2中的ClientThread类。
2.TSObjectProxy(线程持有的对象的代理人)
TSObjectProxy角色会执行多个Client角色委托给的处理。是示例程序2中的Log类。
3.TSObjectCollection(线程持有的对象的集合)
TSObjectCollection角色有一张Client角色与TSObject角色之间的对应表。是示例程序2中的java.lang.ThreadLocal类。
4.TSObject(线程持有的对象)
TSObject角色中保存着线程持有的信息,是示例程序2中的TSLog类。
5.Thread-Specific Storage模式的类图
6.Thread-Specific Storage模式的时序图
java多线程之Thread-Specific Storage模式
2018-02-24 14:25:27 更多
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/smartdt/article/details/79361099
一、Thread-Specific Storage模式
Specific是特定的意思,Storage模式是储存柜的意思,因为所谓Thread-Specific Storage就是“每个线程特有的储物柜”“为每个线程准备储存空间”的意思。
Thread-Specific Storage模式是一种即使只有一个入口,也会在内部为每个线程分配特有的储存空间的模式。
二、关于java.lang.ThreadLocal类(就是储物间)
将java.lang.ThreadLocal的实例当作一种集合可能会有助于理解它,也就是说ThreadLocal的实例会管理多个对象。
- set方法
ThreadLocal类的set方法用户将通过参数接收的实例与调用该方法的线程对应并存储起来,这里存储的对象可以通过get方法获取,set方法中没有表示线程的参数,set方法会先查询当前线程,然后以它作为键来存储实例。
调用set方法相当于将自己的行李放置到自己的存物柜中。
- get方法
ThreadLocal类的get方法用户获取与调用get方法的线程(当前线程)对应的实例,该线程之前通过set方法存储的实例就是get方法的返回值,如果之前一次都还没有调用过set方法,则get方法的返回值为null。
与set方法一样,get方法中也没有表示线程的参数,因为,get方法也会去查询当前线程,即get方法会以当前线程自身作为键去获取对象。
调用get方法相当于从自己的储物柜中取出自己的行李。
public class ThreadLocal<T> { //存储 public void set(T value) { ... } //获取 public T get() { ... } ...}
即通过ThreadLocal的T指定的类型就是set方法的参数的类型以及get方法的返回值的类型。
三、不使用Thread-Specific Storage模式示例程序
1.示例程序一览表
类名 | 说明 |
---|---|
Log.java | 创建日志的类 |
Main.java | 测试示例程序的类 |
2.示例程序的类图
3.Log类
public class Log { /** * 是用于在名为log.txt的文件中记录程序运行记录的类。 * writer字段中保存的是用于写文件的java.io.PrintWriter的实例。 * println方法是用于将通过参数接收到的字符串写入到文件中的方法。 * close方法是用于关闭日志文件的方法。 */ private static PrintWriter writer = null; //初始化writer字段 static { try { writer = new PrintWriter(new FileWriter("log.txt")); } catch (IOException e) { e.printStackTrace(); } } //写日志 public static void println(String s) { writer.println(s); } //关闭日志 public static void close() { writer.println("===end of log==="); writer.close(); }}
4.Main类
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(1000); } catch (InterruptedException e) { e.printStackTrace(); } } Log.close(); System.out.println("End"); }}
5.运行结果
BeginEnd //for循环中设置的等待时间是1s,这里大约10s后显示
6.文件内容
main: i = 0main: i = 1main: i = 2main: i = 3main: i = 4main: i = 5main: i = 6main: i = 7main: i = 8main: i = 9===end of log===
7.示例程序的Timethreads图
四、使用Thread-Specific Storage模式示例程序
1.示例程序类的一览表
类名 | 说明 |
---|---|
TSLog.java | 创建日志的类(实例属于各个线程所有) |
Log.java | 创建日志的类(分配各个线程) |
java.lang.ThreadLocal | 分配线程特有的存储空间的类 |
ClientThread.java | 表示调用Log的线程的类 |
Main | 测试示例程序的类 |
2.示例程序的类图
3.TSLog类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson2;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;public class TSLog {private PrintWriter writer = null;//初始化writer字段public TSLog(String filename) {try {writer = new PrintWriter(new FileWriter(filename));} catch (IOException e) {e.printStackTrace();}}//写日志public void println(String s) {writer.println(s);}//关闭日志public void close() {writer.println("=== End of log ===");writer.close();}
}
4.Log类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson2;public class Log {private static final ThreadLocal<TSLog> tslogCollection = new ThreadLocal<TSLog>();//写日志public static void println(String s) {getTSLog().println(s);}//关闭日志public static void close() {getTSLog().close();}//获取线程特有的日志private static TSLog getTSLog() {TSLog tsLog = tslogCollection.get();//如果该线程是第一次调用本方法,就新生成并注册一个日志if (tsLog == null) {tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt");tslogCollection.set(tsLog);}return tsLog;}
}
5.ClientThread类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson2;/*** @Auther: viagra* @Date: 2019/11/19 20:22* @Description:*/
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(getName() + " i = " + i);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}Log.close();System.out.println(getName() + " End");}
}
6.Main类
package com.viagra.Thread_Specific_Storage_Pattern.Lesson2;/*** @Auther: viagra* @Date: 2019/11/19 20:27* @Description:*/
public class Main {public static void main(String[] args) {new ClientThread("Steve Nash").start();new ClientThread("Michael Jordan").start();new ClientThread("Ronaldo").start();}
}
7.运行结果
Steve Nash Begin
Michael Jordan Begin
Ronaldo Begin
Michael Jordan End
Steve Nash End
Ronaldo End
//这里分别创建了Michael Jordan-log.txt、Ronaldo-log.txt、Steve Nash-log.txt
8.生成文件内容
//如Michael Jordan-log.txt
Michael Jordan i = 0
Michael Jordan i = 1
Michael Jordan i = 2
Michael Jordan i = 3
Michael Jordan i = 4
Michael Jordan i = 5
Michael Jordan i = 6
Michael Jordan i = 7
Michael Jordan i = 8
Michael Jordan i = 9
=== End of log ===
9.示例程序的Timethreads图
五、Thread-Specific Storage模式中角色
1.Client(委托者)
Client角色将处理委托给TSObjectProxy角色,一个TSObjectProxy角色会被多个Client角色使用,是示例程序2中的ClientThread类。
2.TSObjectProxy(线程持有的对象的代理人)
TSObjectProxy角色会执行多个Client角色委托给的处理。是示例程序2中的Log类。
3.TSObjectCollection(线程持有的对象的集合)
TSObjectCollection角色有一张Client角色与TSObject角色之间的对应表。是示例程序2中的java.lang.ThreadLocal类。
4.TSObject(线程持有的对象)
TSObject角色中保存着线程持有的信息,是示例程序2中的TSLog类。
5.Thread-Specific Storage模式的类图
6.Thread-Specific Storage模式的时序图
java多线程之Thread-Specific Storage模式相关推荐
- java多线程之Single Threaded Execution模式
一.简介 所谓Single Threaded Execution模式,就是指"以一个线程执行",就像一座独木桥同一时间内只允许一个人通过一样,该模式用于设置限制,以确保同一时间内只 ...
- (一)java多线程之Thread
目录 Thread类 创建一个线程 java创建线程有两种方式 实现 区别 让线程"睡"一会 停止线程 线程的属性 Thread.join() Thread.yield 线程的异常 ...
- java new thread()_(一)java多线程之Thread
Thread类 学习java线程的开发者,首先遇到的第一个类就是Thread,通过使用Thread类,我们就可以启动,停止,中断一个线程. 在同一个时间片里, 可能会有多个线程在执行, 每个线程都拥有 ...
- Java多线程之Runable与Thread
Java多线程是Java开发中的基础内容,但是涉及到高并发就有很深的研究可做了. 最近看了下<Java并发实战>,发先有些地方,虽然可以理解,但是自己在应用中很难下手. 所以还是先回顾一下 ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- Java多线程之Callable、Future和FutureTask
Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...
- Java多线程之CAS缺点
Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...
- Java多线程之volatile详解
Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...
- Java多线程之Semaphore用法
Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...
- Java多线程之CyclicBarrier用法
Java多线程之CyclicBarrier用法 本文目录 CyclicBarrier的基本概念 CyclicBarrier的案例:集齐7颗龙珠就可以召唤神龙 1. CyclicBarrier的基本概念 ...
最新文章
- ESXI上的vm虚拟机文件被锁定无法POWER ON的问题处理
- 网站优化人员必须具备的几个工作原则
- Android--UI之DatePicker、TimePicker...
- PHP项目中,记录错误日志
- python 复制文件_python 复制文件
- oracle之单行函数之多表查询
- Google搜索网址
- 中国剩余定理编程实现
- 网页加速系列(六)、 网页加速之进阶下篇
- STM32 F107VC移植freeRTOS
- JVM(2):垃圾收集器与gc
- 如何在微信小程序里面退出小程序
- 电磁场与仿真软件(21)
- 微信小程序iphone11 wx.openBluetoothAdapter 返回状态10001 当前蓝牙适配器不可用
- 大数据学习路线-(值得收藏)
- 金山WPS:云端协同 AI赋能 WPS树起了Office新四大件|企服三会系列报道
- Python 使用 matplotlib绘制3D图形
- 写给Java 工程师们一封信
- 无胁科技-TVD每日漏洞情报-2022-11-24
- ncr管理系统_NCR安全的软件配置
热门文章
- 计算机网络树形结构例子,网络拓扑结构大全和实例
- html按钮圆弧样式,几款不错的按钮样式汇总
- 开学至此时总结。(月末总结好像一直没写)
- Pseudo-terminal will not be allocated because stdin is not a terminal
- Word 重复引用同一个脚注
- 谈谈业务系统的监控报警
- 【Flink】Flink 做检查点 报错 Checkpoint Coordinator is suspending.
- Python3自然语言(NLTK)——语言大数据
- 如何安装linux系统步骤
- css3中-moz、-ms、-webkit各什么意思