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
     */
  • 相关阅读:
    作业3月30号
    21、,模块与包的使用
    作业3月26号
    20、面向函数与匿名函数及模块
    作业3月25号
    19、迭代器及函数的递归调用
    作业3月24号
    06-函数
    3.17---购物车练习
    3.15---文件处理练习2
  • 原文地址:https://www.cnblogs.com/gxlaqj/p/11698223.html
Copyright © 2011-2022 走看看