`
pan_java
  • 浏览: 289023 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多线程设计模式--Thread-specific Storage

阅读更多
日志操作类
public class TSLog {
    private PrintWriter writer = null;

    //  初始化writer字段
    public TSLog(String filename) {
        try {
            writer = new PrintWriter(new FileWriter("c:\\"+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 Log {
    private static final ThreadLocal<TSLog> tsLogCollection = new ThreadLocal<TSLog>();

    // 加入一个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 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();
    }
}


ThreadLocal 的定义

该类提供了线程局部变量。这些变量不同于它们的普通对应物,因为访问一个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的私有静态字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。

例如,在下面的类中,私有静态 ThreadLocal 实例(serialNum)为调用该类的静态 SerialNum.get() 方法的每个线程维护了一个“序列号”,该方法将返回当前线程的序列号。(线程的序列号是在第一次调用 SerialNum.get() 时分配的,并在后续调用中不会更改。)

 public class SerialNum {
     // The next serial number to be assigned
     private static int nextSerialNum = 0;

     private static ThreadLocal serialNum = new ThreadLocal() {
         protected synchronized Object initialValue() {
             return new Integer(nextSerialNum++);
         }
     };

     public static int get() {
         return ((Integer) (serialNum.get())).intValue();
     }
 }

每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
分享到:
评论

相关推荐

    java多线程设计模式详解(PDF及源码)

    Phase Termination——快把玩具收拾好,去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B...

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

    目录: 漫谈UML Introduction 1 Java语言的线程 Introduction 2 多线程...总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献

    unix/linux多线程编程指南(sun技术文档)

    - 描述:一个典型的多线程编程模式,包括生产者线程(负责生成数据)和消费者线程(处理数据)。 - 实现方式:通常使用条件变量和互斥锁来协调生产者和消费者线程之间的通信。 - **读写锁(Reader-Writer Locks)...

    设计模式.pdf_学习模式必备

    - **Thread-Specific Storage**:线程局部存储模式,为每个线程提供独立的存储空间。 ### 总结 设计模式是程式设计中不可或缺的一部分,通过对设计模式的学习和应用,开发者可以提高代码的可读性、可维护性和可...

    36种最新设计模式整理

    35. **线程局部存储模式\(Thread-Specific Storage\)**:为每个线程提供一个单独的数据存储区域,避免数据竞争。 以上36种设计模式是软件开发中经常遇到的,理解并掌握这些模式能帮助开发者编写出更灵活、可维护和...

    良葛格DesignPattern学习笔记

    良葛格的《Design Pattern学习笔记》不仅涵盖了经典的GOF设计模式,还额外介绍了几种多线程模式,这使得这份学习笔记成为了一个宝贵的学习资源。下面将对其中的部分设计模式进行详细介绍。 #### 二、GOF设计模式 ...

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

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

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

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

    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支持时间管理和日期操作...

    ACE.zip_ACE技术

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

    ACE(Adaptive Communication Environment)

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

    ACE5.zip ACE5官网源码

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

    ACE库(linux)

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

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

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

    ACE 程序员指南 源代码

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

Global site tag (gtag.js) - Google Analytics