美文网首页多线程
Thread-Specific Storage模式

Thread-Specific Storage模式

作者: null12 | 来源:发表于2018-03-23 20:25 被阅读0次

    一、定义
    Thread-Specific Storage就是“线程独有的存储库”,该模式会对每个线程提供独有的内存空间。
    java.lang.ThreadLocal类提供了该模式的实现,ThreadLocal的实例是一种集合(collection)架构,该实例管理了很多对象,可以想象成一个保管有大量保险箱的房间。

    java.lang.ThreadLocal类的方法:

    • public void set()
      该方法会检查当前调用线程,默认以该线程的Thread.currentThread()值作为键,来保存指定的值。
    • public Object get()
      该方法会检查当前调用线程,默认以该线程的Thread.currentThread()值作为键,获取保存指定的值。

    二、模式案例
    TSLog类:

    //实际执行记录日志的类,每个线程都会拥有一个该类的实例
    public class TSLog {
        private PrintWriter writer = null;
        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();
        }
    }
    

    Log类:

    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 = (TSLog) tsLogCollection.get();
            if (tsLog == null) {
                tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt");
                tsLogCollection.set(tsLog);
            }
            return tsLog;
        }
    }
    

    ClientThread类:

    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");
        }
    }
    

    执行:
    Alice、Bobby、Chris三个线程调用Log类的同一个方法,但实际上每个线程都拥有独自的TSLog实例。

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

    三、模式讲解
    Thread-Specific Storage模式的角色如下:

    • Client(委托人)参与者
      Client参与者会将工作委托给TSObjectProxy参与者。(案例中的ClientThread类就是Client)
    • TSObjectProxy(线程独有对象的代理者)参与者
      TSObjectProxy参与者会处理多个Client委托的工作。(案例中的Log类就是TSObjectProxy)
    • TSObjectCollection(线程独有对象的集合)参与者
      (案例中的java.lang.ThreadLocal类就是TSObjectCollection)
    • TSObject(线程独有的对象)参与者
      TSObject存放线程所特有的信息,TSObject实例的方法只会由单线程调用,由TSObjectCollection管理,每个线程都拥有独立的TSObject实例。(案例中的TSLog类就是TSObject)

    相关文章

      网友评论

        本文标题:Thread-Specific Storage模式

        本文链接:https://www.haomeiwen.com/subject/smxfcftx.html