`

Thread Specific Storage

 
阅读更多

         这个模式是这样的:所有线程都有一个入口,但是内部为每个线程分配了特有的存储空间。

         这里需要用到ThreadLocal类,这个类的实例可以想象成保管箱间,他有大量的保管箱房间。ThreadLocal的实例只有一个但是管理多个对对象。他有方法set和(Object)get,set用来存储,这个方法是没有参数的,它会自动存放当前线程;而get用来取(没有拿走)线程,同样没有参数,因为他自己就是键值。

         示例:TSLog用来做具体的写入工作

          Log中有类属性ThreadLocal,用来读取的时候从ThreadLocal里面找到自己的线程用的TSLog类,然后把工作交给TSLog。取的时候先看当前线程是谁,然后找到这个线程放的TSLog。

          CLientThread类开启一个线程,这个线程调用Log类。

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TSLog {
		private static PrintWriter writer=null;
		public  TSLog(String filename){
			try{
				writer=new PrintWriter(new FileWriter(filename));
			}catch(IOException e){
				e.printStackTrace();
			}
		}
		public static void println(String s){
			writer.println(s);
		}
	    public static void close(){
	    	writer.println("==== END LOG ====");
	    	writer.close();
	    }
}

 

public class Log {
	private static final ThreadLocal tsLogCollection=new ThreadLocal();
	public static void println(String s){
		getTSLog().println(s);
	}
	public static void close(){
		getTSLog().close();
	}
	private static TSLog getTSLog(){
		TSLog tsLog=(TSLog)tsLogCollection.get();
		if(tsLog==null){
			tsLog=new TSLog(Thread.currentThread().getName()+"-log.txt");
			tsLogCollection.set(tsLog);
		}
		return tsLog;
	}

}

 

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++){
    		NewLog.println("i="+i);
    		try{
    			Thread.sleep(100);
    		}catch(InterruptedException e){
    			e.printStackTrace();
    		}
    	}
    	NewLog.close();
    	System.out.println(getName()+"End");
    }
}

 

public class Test {
	public static void main(String[] args){
		new ClientThread("Alice").start();
		new ClientThread("Bobby").start();
		new ClientThread("Chris").start();
	}
}

 

        这里,每个线程要做的具体工作TSLog实际在线程外,它被放到保管箱相(ThreadLocal)中,由所属线程去取。这里也不用担心其他线程会访问TSLog。需要注意的是互斥控制可能会隐藏在TSObjectionColecction。

 

 

 

 

分享到:
评论

相关推荐

    ACE开发实例

    `ACE_TSS`(Thread Specific Storage)类解决了多线程环境下的全局变量同步问题,为每个线程提供了一种私有化全局数据的机制,避免了同步冲突。 `ACE_Thread_Manager`类提供了多种方法以支持线程管理。例如,`...

    ACE(Adaptive Communication Environment)

    ACE_TSS(Thread Specific Storage)则允许开发者在多线程环境中为每个线程存储私有数据,确保数据的安全性和隔离性。 除了基本功能外,ACE还提供了一些高级特性,如服务质量(QoS)管理、网络容错和恢复机制、性能...

    ACE.zip_ACE技术

    在对象间通信方面,ACE提供了ACE_TSS(Thread Specific Storage)机制,用于存储线程局部数据,以及ACE_Acceptor和ACE_Connector类,它们简化了服务器和客户端的建立连接过程。ACE_ServantActivator和ACE_Svc_...

    ACE 程序员指南 源代码

    7. **分布式系统设计**:ACE_TSS(Thread Specific Storage)用于线程局部存储,ACE_Logger提供日志记录,ACE_WFMO_Reactor实现了Windows下的基于WaitFOrMultipleObjects的反应器。 8. **性能优化**:ACE_Dynamic_...

    ACE库(linux)

    ACE_TSS(Thread Specific Storage)类允许开发者创建线程局部存储,解决了多线程环境下数据隔离的问题。 在分布式系统方面,ACE库支持CORBA(Common Object Request Broker Architecture),提供了一套完整的ORB...

    Pthreads APIs - User's Guide and Reference

    Thread specific storage APIs 允许每个线程拥有独立的数据存储,使得线程可以使用与其它线程不同的变量值,而不必担心数据共享问题。Thread cancellation APIs 为线程提供了一种机制,使得线程可以在某个点被取消,...

    ACE_OS命名空间函数参考文档

    在实际开发中,配合`ACE_TSS`(Thread Specific Storage)来管理线程局部存储,或者使用`ACE_Sched_Params`来调整调度策略,可以进一步提升应用程序的性能和适应性。总之,理解和熟练掌握`ACE_OS`命名空间的函数是...

    ACE5.zip ACE5官网源码

    2. **ACE_TSS (Thread Specific Storage)**:ACE提供了一种线程局部存储的实现,通过`ACE_TSS`类,可以在线程级别存储数据,保证了数据在多线程环境下的安全性。 3. **ACE_Acceptor and ACE_Connector**: 这两个类...

    C++网络编程 卷2 基于ACE和框架的系统化复用

    ACE_TSS(Thread Specific Storage)则提供了线程局部存储的解决方案,避免了多线程环境下数据共享带来的复杂性。 此外,书中的“系统化复用”概念强调了软件设计的模块化和可重用性。作者会讲解如何利用ACE库中的...

    C++ 网络编程(经典版)

    3. **对象之间的通信**:ACE提供了一套完整的消息传递和对象间通信机制,如ACE_TSS(Thread Specific Storage)用于线程局部存储,ACE_Acceptor和ACE_Connector实现服务端和服务客户端的连接管理。 4. **网络协议的...

    ACE-6.1.1.tar

    ACE框架包含多个关键组件,如ACE_TSS (Thread Specific Storage)用于线程局部存储,ACE_Reactor模式处理事件,ACE_SOCK和ACE_SOCK_Dgram用于TCP/IP和UDP通信,ACE_Time_Value和ACE_DateTime支持时间管理和日期操作...

    [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]

    【并发并行】_【C/C++]_【使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例】 在多线程编程中,线程本地存储(Thread Local Storage,简称TLS)是一种用于存储线程私有数据的技术。每个线程都有...

    Java多线程详解

    Java多线程模式详解 目录: 一、漫谈UML Java语言的线程 多线程的评量标准 二、 ...11、Thread-Specific Storage ———— 每个线程的保管箱 12、Active Object ———— 接受异步消息的主动对象

    linux-thread.rar_linux multi thread_linux thread_thread_thread l

    10. **线程局部存储**:线程局部存储(TLS,Thread Local Storage)允许每个线程拥有自己的变量副本,避免了线程间的数据冲突。`pthread_getspecific()`和`pthread_setspecific()`函数用于访问和设置线程局部存储。 ...

    C++_Boost_Thread_编程指南

    线程局部存储(Thread Local Storage,TLS)使得每个线程可以拥有自己独立的变量副本,即使这些变量在全局或静态作用域内。`boost::thread_specific_ptr`是Boost库提供的一个工具,用于管理线程特有的指针,防止内存...

    ACE技术论文集(已翻译为中文)

    第5章 C/C++线程专有存储(Thread-Specific Storage):用于访问“per-Thread”状态的对象行为模式 第6章主动对象(Active Object):用于并发编程的对象行为模式 第 7 章 ACE 反应器(Reactor)的设计和使用:用于...

    java多线程设计模式 (PDF中文版, 附源码)

    第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D ...

    线程私有数据示例代码

    在Linux系统编程中,线程私有数据(Thread Local Storage,TLS)是一种机制,它允许每个线程拥有自己独立的数据副本,确保了数据在多线程环境中的安全性。线程私有数据通常用于存储线程特定的信息,如线程ID、调试...

    android TLS

    在Android系统中,TLS(Thread-Local Storage)是一种机制,用于在多线程环境中为每个线程维护独立的数据存储。这种存储方式确保了每个线程都有自己的数据副本,避免了传统全局变量在并发访问时可能出现的竞态条件和...

    linux U盘驱动流程分析.pdf

    - EFh:FEh:FFh:预留(Vendor Specific) 三、U盘驱动代码与枚举过程 1. Linux内核中负责USB存储设备驱动的代码文件主要分布在以下路径: - drivers/usb/storage/usb.c - drivers/usb/storage/transport.c - ...

Global site tag (gtag.js) - Google Analytics