zoukankan      html  css  js  c++  java
  • 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();
    
        }
    }
    
  • 相关阅读:
    100个经典的动态规划方程
    poj 2105 IP Address
    codeforces 299 A. Ksusha and Array
    codeforces 305 C. Ivan and Powers of Two
    性能测试实战 | 修改 JMeter 源码,定制化聚合压测报告
    Pytest 测试框架训练营,测试大咖带你搞定自动化+接口测试实战 | 限时免费报名
    MTSC 测试开开发大会(深圳站),报名立减 100 元!
    测试人面试 BAT 大厂之前,需要做好哪些准备?
    iOS 自动化测试踩坑(二):Appium 架构原理、环境命令、定位方式
    【北京】美团打车招聘职位
  • 原文地址:https://www.cnblogs.com/mr-ziyoung/p/13388323.html
Copyright © 2011-2022 走看看