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();
    
        }
    }
    
  • 相关阅读:
    事以密成,能者低调
    时间过得真快,一晃三年过去了
    读书随记2011111
    Makefile
    ubuntu 7 下 tftp 的配置
    uboot移植到nano2410
    ubuntu 7.04 Feisty Fawn 安装手记之五:安装常用软件
    移植linux2.6.18到arm9
    移植busybox 1.4.2
    UBoot中SMDK2410的NAND Flash驱动。
  • 原文地址:https://www.cnblogs.com/mr-ziyoung/p/13388323.html
Copyright © 2011-2022 走看看