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();
    
        }
    }
    
  • 相关阅读:
    HBase with MapReduce (MultiTable Read)
    HBase with MapReduce (SummaryToFile)
    HBase with MapReduce (Summary)
    HBase with MapReduce (Read and Write)
    HBase with MapReduce (Only Read)
    Hbase中的BloomFilter(布隆过滤器)
    HBase的快照技术
    How To Use Hbase Bulk Loading
    Cloudera-Manager修改集群的IP
    Java中的HashSet和TreeSet
  • 原文地址:https://www.cnblogs.com/mr-ziyoung/p/13388323.html
Copyright © 2011-2022 走看看