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 + '\'' + '}'; }}