一  Thread-Specific Storage Pattern

Thread-Specific Storage Pattern指的就是线程独有的储藏库,针对每个线程提供内存空间的意义。这种模式只有一个入口,但是内部会对每个线程提供特有的存储空间。

Thread-Specific Storage Pattern的所有参与者:

1,Client参与者,提出具体工作的,将该具体工作委托给TSObjectProxy参与者。

2,TSObjectProxy参与者,这个主要是接受工作请求的,它会处理多个Client的工作,它一般都包括了TSObjectCollection。一般都是先使用TSObjectCollection参与者,取得Client参与者所对应的TSObject参与者,并将Client具体的工作委托给TSObject参与者。

3,TSObjectCollection参与者,这个主要就是线程独有对象的集合,它利用线程键值对来存储着执行Client参与者线程所对应的TSObject参与者。一般都是利用ThreadLocal来实现。

4,TSObject参与者,线程独有的对象,存放着线程特有的信息,尽管会为多个线程使用,但是不需要利用synchronized来进行互斥操作。

TSObject参与者与TSObjectProxy参与者具有相同的接口。

具体的模式如下图所示。虽然多个不同的ClientThread来请求同一个对象Log即TSObjectProxy参与者,但是Log会为每个请求线程利用ThreadLocal来分配独立的TSLog对象。所有线程所共享的是TSObjectProxy参与者。

关于ThreadLocal小讲:

每一个线程都拥有自己独立的存储空间,也就是方法局部变量的堆栈,在方法里分配的局部变量都是线程所独有的,但是这些变量一退出方法就会消失了。ThreadLocal则是与方法调用无关,它为线程分配特有空间。

ThreadLocal实例如一个保管箱间,它通过线程键值对来存储与线程特定的信息。每个线程的保管箱,都放置在ThreadLocal中。

ThreadLocal该类提供了线程局部变量。ThreadLocal的局部变量在被多个线程使用时候,每个线程只能拿到该变量的一个副本。

在ThreadLocal类型的变量内部有个ThreadLocalMap,它提供了一个注册表来注册与当前线程相关的信息,ThreadLocal类型的变量对外部表现是一个,但是内部确实管理着一群对象的集合。

在利用get与set的时候,都会在两个方法体中首先获取Thread t = Thread.currentThread();,然后在该线程的内部进行操作。不用担心其他线程对于该线程的破坏访问。在使用两个方法的时候务必要分清是属于那个线程中的操作。

在这个模式中,客户端线程所共享的是TSObjectProxy参与者,但是实际的工作则是在TSObject参与者分配给相应的线程后才进行的,就是利用TSObjectProxy参与者来分配不被共享的TSObject参与者。对于TSObject完全不用做任何的互斥synchronized操作。

代码示例:

仅仅列出TSObjectProxy的架构模式

Log代表了TSObjectProxy参与者,供多个线程进行访问,最后将具体的操作委托给TSObject

package whut.specificstorage;

//负责产生保管箱间的类

public class Log {

//首先利用static final修饰

//保证了所有访问该类的线程都只使用一个唯一的且不变的保管箱间。

private static final ThreadLocal tsLogCollections=new ThreadLocal();

//不用使用synchronized,因为在使用get和set时候,会字段判别当前所属的线程

//取得当前线程特有的Log

private static TSLog getTSLog()

{

TSLog tsLog=(TSLog)tsLogCollections.get();

//如果线程是第一次调用,就建立新文件夹以及注册log

if(tsLog==null)

{

tsLog=new TSLog(Thread.currentThread().getName()+"-log.txt");

tsLogCollections.set(tsLog);

}

return tsLog;

}

//加入一条LOG

public static void println(String s)

{

getTSLog().println(s);

}

//关闭LOG

public static void close()

{

getTSLog().close();

}

}

该Log类具有TSobject相同的方法,客户端线程每次请求该类,进而为请求的线程分配属于该线程的TSObject对象,每次的工作都是最终委托给TSObject来真正的执行。TSObjectProxy和TSObject类的方法与字段不需要进行任何的synchronized处理。

java 多线程库_Java多线程设计模式(7)线程独有储藏库模式相关推荐

  1. java 多线程 进程_Java多线程1:进程与线程概述

    进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...

  2. java多线程编程_Java多线程编程实战指南+设计模式篇.pdf

    Java多线程编程实战指南+设计模式篇.pdf 对Java架构技术感兴趣的工程师朋友们可以关注我,转发此文后私信我"Java"获取更多Java编程PDF资料(附送视频精讲) 关注我 ...

  3. java的多线程机制_Java多线程开发(一)| 基本的线程机制

    0. 前言 Java 为了实现跨平台,在语言层面上实现了多线程.我们只需要熟悉 Java 这一套多线程机制就行了,比 C/C++ 要容易多了. 1. 定义任务 我们编写程序,最终是为了完成特定的任务. ...

  4. java多线程面试_Java多线程和并发基础面试问答,看过后你不会后悔

    ***:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java ...

  5. java volatile 死锁_Java 多线程:volatile 变量、happens-before 关系及内存一致性

    原标题:Java 多线程:volatile 变量.happens-before 关系及内存一致性 来源:ImportNew - paddx 更新 请参考来自 Jean-philippe Bempel ...

  6. java 缓存一致性_Java多线程——CPU缓存原理和缓存一致性问题

    说起Java中的多线程,就不得不说volatile关键词volatile关键词执行修饰变量和实例变量,不能修饰方法参数,局部变量和实例常量. volatile是Java提供的一种轻量级的同步机制,在并 ...

  7. java 多线程 总结_Java 多线程总结

    昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结. 首先我们先来了解一下进程.线程.并发执行的概念: 进程是指:一个内存中运行的应用 ...

  8. java 多线程 关键字_java多线程基础(synchronize关键字)

    线程:进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元. 线程:进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地 ...

  9. java thread类_Java多线程原理及Thread类详解

    多线程原理 代码如下: 自定义线程类: 测试类: 流程图: 程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建.随着调用mt的对象的start方法,另外一 ...

  10. java并发多线程面试_Java多线程并发面试问答

    java并发多线程面试 Today we will go through Java Multithreading Interview Questions and Answers. We will al ...

最新文章

  1. Redis在SSM项目中的简单使用
  2. STM32常用数据类型 u8、u16、u32
  3. 7.7. 其他证书工具
  4. arthas class/classloader相关命令之一:sc、sm
  5. C++98C++11的区别
  6. SQL终极优化(包括很多非索引方面的优化和原理)
  7. mat-form-field must contain a MatFormFieldControl错误的解决方法
  8. 工作247:uniapp--实战--flex布局--商户星级
  9. 001 基本的环境的安装
  10. sping 总结(03)springmvc
  11. html中如何淡化背景图片,如何去除图片背景?
  12. 台式计算机主板接口识别,硬件丨当前台式机主板接口知识普及与主板结构全讲解...
  13. 注释里面 //TODO... 的作用
  14. python新打包工具,最好用的版本之一,不接受反驳
  15. android模拟器 知乎,安卓模拟器排行榜 知乎大神评测速度多开哪个好
  16. (附源码)springboot基于微信小程序的校园外卖系统 毕业设计091024
  17. python网页转PDF
  18. 机器学习的可解释性(总结)
  19. 【Halcon视觉】定位
  20. 某杭州女人的择偶标准

热门文章

  1. linux 系统挂载ISO 文件
  2. 路由器中继模式WISP、Client + AP、AP模式的区别和适使用场景
  3. 就计算机应用领域而言航天器,婴幼儿耳道长耵聍,应该用()工具取出A.耳挖勺B.火柴棍C.棉签D.卡子...
  4. Windows 7 插件KB4474419安装 Symantec Endpoint Protection 只能安装在具有SHA-2代码签名支持更新(KB4474419)的系统上
  5. xp任务栏一直闪跳怎么办_电脑任务栏闪烁以及任务栏图标闪烁解决办法
  6. 《幸福来敲门》观后感
  7. NOIp模拟赛 巨神兵(状压DP 容斥)
  8. NoteExpress
  9. 日语学习网站分类汇总
  10. 使用GDAL实现DEM的地貌晕渲图(三)