• 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();
    
        }
    }
    
  • 相关阅读:
    泉音作伴到云乡
    给力品牌营销,打造自己的知名度品牌
    【linux】如何利用mkfifo命令让程序产生的文件直接生成压缩文件
    【linux/perl】终端运行的程序怎么屏蔽错误信息的输出?
    四个俄罗斯人算法(Method of Four Russians)
    perl 释放内存问题【转】
    【perl】perl实现case条件判断的语句
    【linux】/dev/null与/dev/zero详解
    【perl】打开多个文件——文件句柄的使用
    EM算法——最大期望算法(Expectationmaximization algorithm)
  • 原文地址:https://www.cnblogs.com/mr-ziyoung/p/13388323.html
Copyright © 2020-2023  润新知