zoukankan      html  css  js  c++  java
  • Java--ThreadLocal原理与使用

    ThreadLocal保证线程安全:

    ThreadLocal内部持有ThreadLocalMap对象,线程内部单独创建副本,来保证数据隔离,但是由于ThreadLocalMap中key为弱引用,GC自动回收,但是value如果为强引用,就没法回收,就会造成内存泄露(除非线程退出)

    关于垃圾回收(自动回收堆中没引用的对象空间):https://www.jianshu.com/p/23f8249886c6

    参考链接:https://www.cnblogs.com/jalon/p/14819372.html



        /*
        * 线程安全:
        * 1.synchronized修饰
        * 2.ThreadLocal修饰--数据隔离
        *
        * */
        private ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>(){
            @Override
            protected SimpleDateFormat initialValue() {
                // 这里会输出10次,分别是每个线程的id
                System.out.println(Thread.currentThread().getId());
                return new SimpleDateFormat("yyyy-MM-dd");
            }
        };
        public void parse2(String dateString){
            try {
                System.out.println(threadLocal.get().parse(dateString));
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    
    
        private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        public void parse(String dateString){
            try {
                synchronized (simpleDateFormat){
                    System.out.println(simpleDateFormat.parse(dateString));
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        @Test
        void testThreadLocal(){
            ExecutorService service = Executors.newFixedThreadPool(10);
            for (int i = 0; i < 300; i++) {
                service.submit(() -> {
    //               parse("2021-05-30");
                    parse2("2021-05-30");
                });
            }
        }
    

    我曾七次鄙视自己的灵魂:
    第一次,当它本可进取时,却故作谦卑;
    第二次,当它在空虚时,用爱欲来填充;
    第三次,在困难和容易之间,它选择了容易;
    第四次,它犯了错,却借由别人也会犯错来宽慰自己;
    第五次,它自由软弱,却把它认为是生命的坚韧;
    第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
    第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
  • 相关阅读:
    PHP的错误和异常处理
    异步并行批处理框架设计的一些思考
    系统出错信息设计
    SpringMVC+Shiro权限管理
    jstl教程
    为什么Lisp语言如此先进
    「只差程序员」为什么会招黑? [转自:知乎]
    大侠是怎样炼成的 周昆 [转]
    【OpenGL】glFinish()和glFlush()函数详解-[转]
    VC++ 6.0中实现三叉切分窗口与多视图 [转]
  • 原文地址:https://www.cnblogs.com/meditation5201314/p/14828302.html
Copyright © 2011-2022 走看看