设计模式拯救代码
静态方法是对类上锁,这个类定义了两个,所以是去竞争同一个类的锁,
ThreadLocal
SimpleDateFormat
ThreadLocal 让每个线程保存自己的变量副本
为多线程环境下变量安全提供的一种解决思路,给每个线程建立自己的单独的变量
内部类 ThreadLocalMap 实现线程隔离机制 key, value组成的一个Entry数组,key 就是ThreadLocal他本身的一个弱引用,valve是对应的线程变量副本
ThreadLocal 他本身是不存储值的,他只是提供一个能查到这个值的key
ThreadLocal 包含在 Thread 中
内存泄漏
只有Key是弱引用,value还是强引用的关系,
如果一个ThreadLocal没有外部强引用来引用他,GC的时候,弱引用会被回收,ThreadLocalMap会出现key为null的Entry,就不能通过key找到value,value是强引用的,会一直存在,就内存泄漏,,但是 get set remove都会对key为null的Entry 进行清除,把他的value置为空。
ThreadRe引用这个Thread,
Thread在引用这个ThreadLocal,
ThreadLocal在引用这个Entry,
Entry在引用这个value,
所以我们只要手动调用一下remove方法 就不会出现内存泄漏的问题了。
ReentrantLock
默认采用非公平锁
公平锁
CountDownLatch
靠技术实力称霸,千面鬼手大人万岁!