自己平时学习用来记录日记,会很乱。ThreadLocal用处是保存一个变量副本、使用不当会导致内存溢出,如果用了static关键字,会导致线程不安全。
ThreadLocal实现,ThreadLocal内部定义一个ThreadLocalMap,并定义一个Entry(创建构造方法,以ThreadLocal为key,Object为value),且是数组类型。因为一个线程可能会同时持有多个ThreadlLocal变量。每个线程创建的时候,创建一个属于自己的ThreadLocalMap,entry数组保存了很多个ThreadLocal对应的value键值对。这样就为每个线程保存了一个自己的变量副本。demo如下:
package threadlocal;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @Author: MM
* @Date: 2020/1/7 10:16
* threadLocal内存溢出
*/
public class ThreadLocalOOM {
private static final int TASK_LOOP_SIZE = 500;
final static ThreadPoolExecutor poolExecutor
= new ThreadPoolExecutor(5, 5,
1,
TimeUnit.MINUTES,
new LinkedBlockingQueue<>());
static class LocalVariable {
private byte[] a = new byte[1024*1024*5];/*5M大小的数组*/
}
public static void main(String[] args) throws InterruptedException {
Object o = new Object();
/*5*5=25*/
for (int i = 0; i < TASK_LOOP_SIZE; ++i) {
poolExecutor.execute(new Runnable() {
public void run() {
//localVariable.set(new LocalVariable());
new LocalVariable();
System.out.println("use local varaible");
//localVariable.remove();
}
});
Thread.sleep(100);
}
System.out.println("pool execute over");
}
}