zoukankan      html  css  js  c++  java
  • ThreadLocal

    /*
    ThreadLocal:使用空间换时间  效率更高
    线程同步:使用时间换空间
     
     ThreadLocal可能会导致内存泄漏
     */
    /**
     * ThreadLocal 线程局部变量
     */
    public class ThreadLocal2 {
    
        static ThreadLocal<Person> p = new ThreadLocal<>();
    
        public static void main(String[] args) {
            new Thread(() -> {
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(p.get()); // 2. 虽然threadLocal时共享变量,但是取不到其他线程放入的值,所以此处为null
            }).start();
    
            new Thread(() -> {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                p.set(new Person()); // 1. 往线程局部变量放入一个person
            }).start();
        }
        
        static class Person {
            String name = "zhangsan";
        }
    }
    
    /*
    ThreadLocal:使用空间换时间  效率更高
    线程同步:使用时间换空间
     
     ThreadLocal可能会导致内存泄漏
     */

    线程局部变量

    /**
     * ThreadLocal 线程局部变量
     */
    public class ThreadLocal1 {
    
        /*volatile*/ static Person p = new Person();
    
        public static void main(String[] args) {
            new Thread(() -> {
                System.out.println(p.name);
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(p.name);  // 在加与不加volatile的情况下,这句话打印的值分别是? 答:不写volatile有可能发生可见性问题
            }).start();
    
            new Thread(() -> {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                p.name = "lisi";
            }).start();
        }
        
        static class Person {
            String name = "zhangsan";
        }
    }
    
    /*
    
    如果想要共享变量不可见呢?  就需要使用ThreadLocal
     */
  • 相关阅读:
    LeetCode 867. 转置矩阵
    LeetCode 26. 删除排序数组中的重复项
    LeetCode 905. 按奇偶排序数组
    LeetCode 922. 按奇偶排序数组 II
    CentOS 7.4 系统安装 git
    浅谈final修饰的变量
    【笔试题】京东2017秋招笔试真题
    【笔试题】在 Java 中,如何跳出当前的多重嵌套循环?
    【面试题】反转单链表
    Windows 系统采用批处理命令修改 ip 地址
  • 原文地址:https://www.cnblogs.com/gxlaqj/p/11698223.html
Copyright © 2011-2022 走看看