thread27

来源:互联网 发布:网络填表终结者 下载 编辑:程序博客网 时间:2024/06/05 10:13
package com.neutron.t19;import java.util.concurrent.TimeUnit;/** * ThreadLocal线程局部变量 * * ThreadLocal是使用空间换时间,synchronized是使用时间换空间 * 比如hibernate中session就存在ThreadLocal中,避免synchronized的使用 */public class T192 {    static ThreadLocal<Car> tl = new ThreadLocal<>();    /**     * 按理来说应该是i2线程拿到的数据应该是t1线程保存进去的数据,因此i2应该打印出来bmw一类的数据     * 但是实际结果并非如此,结果是null。     * 解释:     *     ThreadLocal只对当前线程有用,其key值是当前线程。我们查看其set方法     *      public void set(T value) {             Thread t = Thread.currentThread();             ThreadLocalMap map = getMap(t);             if (map != null)                map.set(this, value);             else                createMap(t, value);            }       因此我们能知晓不同的线程,使用的是不同的key,而不是相同的key       如果在线程中使用ThreadLocal相当于在每个线程中使用自己单独的变量,相互之间没有影响和冲突     */    public static void main(String[] args) {        new Thread(() -> {            try {                TimeUnit.SECONDS.sleep(2);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(tl.get());        }, "i2").start();        new Thread(() -> {            try {                TimeUnit.SECONDS.sleep(1);            } catch (InterruptedException e) {                e.printStackTrace();            }            tl.set(new Car());        }, "t1").start();    }}class Car {    String name = "bmw";    @Override    public String toString() {        return "Car{" +                "name='" + name + '\'' +                '}';    }}

原创粉丝点击