zoukankan      html  css  js  c++  java
  • Java源码阅读(三)—— ThreadLocal

    ThreadLocal,叫做线程本地存储,也可以叫做线程本地变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

    一、如何使用

    class Accessor implements Runnable {
    
        private final int id;
    
        public Accessor(int id) {
            this.id = id;
        }
    
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                ThreadLocalVariableHolder.increment();
                System.out.println(this);
                Thread.yield();
            }
        }
    
        public String toString() {
            return "#" + id + ":" + ThreadLocalVariableHolder.get();
        }
    }
    
    
    
    public class ThreadLocalVariableHolder {
    
        private static ThreadLocal<Integer> value = new ThreadLocal<Integer>() {
            protected synchronized Integer initialValue() {
                return 10000;
            }
        };
    
        public static void increment() {
            value.set(value.get() + 1);
        }
    
    
        public static int get() {
            return value.get();
        }
    
        public static void main(String[] args) throws InterruptedException {
            ExecutorService exec = Executors.newCachedThreadPool();
            for (int i = 0; i < 3; i++) {
                exec.execute(new Accessor(i));
            }
            TimeUnit.SECONDS.sleep(1);
            exec.shutdownNow();
        }
    
    
    }
    
    

    在这里插入图片描述

    二、什么场景下使用

    需要避免任务在共享资源上产生冲突。

    三、源码分析

    3.1 WeakReference

    讲到弱引用,就需要知道其他的几个引用。在Java中有4种引用:

    • 强引用
    • 软引用
    • 弱引用
    • 虚引用

    简单说下区别,①如果对象有强引用,则垃圾回收器不会回收它;
    ②如果对象有软引用,只有在内存空间不足,才会被回收。
    ③如果对象有弱引用,则每次垃圾回收时,对象都会被回收。
    ④虚引用不影响对象的生命周期。

    为什么要有这几种引用?

    • 提供通过代码的方式决定对象的生命周期
    • 有利于垃圾回收

    弱引用如何使用

    3.2 ThreadLocalMap

  • 相关阅读:
    【网络流24题】方格取数问题(最大流)
    运维之思科篇——NAT基础配置
    NAT地址转换常用命令详解
    NAT(地址转换技术)详解
    Linux命令之grep用法详解:grep与正则表达式 [转]
    curl查询公网出口IP
    CentOS下安装Telnet服务
    Linux之Xinetd服务介绍
    上市公司年报发布时间是什么时候?
    jackson序列化字段字母大小写及字段名重复
  • 原文地址:https://www.cnblogs.com/fonxian/p/10854648.html
Copyright © 2011-2022 走看看