java并发编程--线程封闭

线程封闭

数据被封闭在各自的线程之中被线程私有,不需要进行同步,这种通过数据封闭在线程中而避免使用同步的技术成为线程封闭。

它具体的体现有:ThreadLocal、局部变量(也叫做栈封闭,它是线程所固有的特点,局部变量位于该线程执行的虚拟机栈中)
示例代码:

/**
 *
 * ThreadLocal为每个线程都创建一个副本,每个线程可以访问自己内部的副本变量。
 * 那ThreadLocal有什么作用呢?如果只是单纯的想要线程隔离,在每个线程中声明一个私有变量就好了呀,为什么要使用ThreadLocal?
 *
 * 如果开发者希望将类的某个静态变量(user ID或者transaction ID)与线程状态关联,则可以考虑使用ThreadLocal。
 * 最常见的ThreadLocal使用场景为用来解决数据库连接、Session管理等。
 * 数据库连接和Session管理涉及多个复杂对象的初始化和关闭。
 * 如果在每个线程中声明一些私有变量来进行操作,那这个线程就变得不那么“轻量”了,需要频繁的创建和关闭连接。
 */
public class ThreadLocalDemo {
    static class ThreadA implements Runnable{

        ThreadLocal<String> threadLocalStr;

        public ThreadA(ThreadLocal<String> threadLocalStr) {
            this.threadLocalStr = threadLocalStr;
        }

        @Override
        public void run() {
            threadLocalStr.set("threadA");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("当前线程为:" + Thread.currentThread().getName() +",threadlocal值为:" +threadLocalStr.get());
        }
    }

    static class ThreadB implements Runnable{

        ThreadLocal<String> threadLocalStr;

        public ThreadB(ThreadLocal<String> threadLocalStr) {
            this.threadLocalStr = threadLocalStr;
        }

        @Override
        public void run() {
            threadLocalStr.set("threadB");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("当前线程为:" + Thread.currentThread().getName() + ",threadlocal值为:" +threadLocalStr.get());
        }
    }

    public static void main(String[] args) {
        ThreadLocal<String> threadLocal = new ThreadLocal<>();
        threadLocal.set("test");
        new Thread(new ThreadA(threadLocal)).start();
        new Thread(new ThreadB(threadLocal)).start();

    }
}
posted @ 2020-07-27 23:09  爪哇洋  阅读(150)  评论(0编辑  收藏  举报