/* 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 */