结论
全局变量 多线程非安全 (堆) static
局部变量 多线程安全 (栈) fina 也可以安全
1:线程调用时 ,每一个线程都拥有一套完整的调用栈帧,栈帧中包含完整的调用方法名,方法的局部变量。而且栈是先入后出,调用方法时入栈,方法结束是出栈。
2:使用线程池时需要注意参数问题 :资料
ThreadPoolTaskExecutor 创建线程池
corePoolSize 最小核心线程数 (必有)
maxPoolSize 最大线程数 (必有)
keepAliveSeconds 空闲线程存活时间 (必有)
queueCapacity 缓存队列数 (必有)
allowCoreThreadTimeOut 存活线程数能否为0 (必有)
3:解决多线程安全问题在于如何解决 堆中变量的值共享问题,可以使用 private final 修饰成员变量,或者使用锁,或者使用threadLocal 变量
threadLocal 原理是 维护了一个 threadLocal map,以threadLocal为key 存储线程变量的值。容易oop,因为使用线程池的时候线程结束并不会直接关闭,会在线程复用的时候读取到上一次未释放的值,所以线程结束时需要使用try finaly threadLocal.remove 释放 也可以使用AutoCloseable自动释放。
加锁使用 方法锁和变量锁
方法锁需要注意获取this锁的时机是否会导致其他线程无法获取锁以解锁导致cpu消耗100%。
标签:java,变量,问题,threadLocal,线程,使用,必有,多线程 From: https://www.cnblogs.com/mingkewang/p/17503435.html