分类:N07_Java
static ThreadLocal tl1 = new ThreadLocal();
static ThreadLocal tl2 = new ThreadLocal();
public static void main(String[] args) {
tl1.set("123");
tl2.set("456");
Thread t1 = new Thread(() -> {
static ThreadLocal tl1 = new ThreadLocal();
static ThreadLocal tl2 = new ThreadLocal();
tl1.set("567");
tl2.set("678");
System.out.println("t1:" + tl1.get());
System.out.println("t1:" + tl2.get());
tl1.set("333");
tl2.set("444");
System.out.println("t1:" + tl1.get());
System.out.println("t1:" + tl2.get());
});
t1.start();
Thread t1 = new Thread(() -> {
static ThreadLocal tl1 = new ThreadLocal();
static ThreadLocal tl2 = new ThreadLocal();
tl1.set("567");
tl2.set("678");
System.out.println("t1:" + tl1.get());
System.out.println("t1:" + tl2.get());
tl1.set("333");
tl2.set("444");
System.out.println("t1:" + tl1.get());
System.out.println("t1:" + tl2.get());
});
如果在线程中设置了2个ThreadLocal值, 那么在重新设置值后, 原始的值是被覆盖还是重新建新的空间, 并且将值的应用更新呢?
能具体讲解一下一个ThreadLocal值被重新覆盖后, 在堆内存的的变化吗?
在多线程的情况下, 如果设置了多个ThreadLocal, 比如:static ThreadLocal tl1 = new ThreadLocal(); static ThreadLocal tl2 = new ThreadLocal();
而且在多线程下比如说有6个线程, 每个线程都设置了这两个值, 那么在java虚拟机的的堆中, ThreadLocalMap是一个吗? 还是2个呢(tl1,tl2分开2个堆)?
能详细的讲解一下吗在堆中值如何构建的吗? 那么这6个线程都设置了tl1, 这个几个值都是在一个ThreadLocalMap上面吗? 能详细的分析一下吗?
在多线程的情况下, 如果设置了ThreadLocal,其中因为key是弱引用, 就会导致在没有强引用指向key时就会被回收,
此时线程其实也就获取不到value值了,
为什么在java中, ThreadLocalMap中的key是设置成为弱引用, 而value则设置成为强引用, 这个是什么原因呢?
能具体分析一下其底层原理呢? 都能设置成弱引用吗? 这样在回收垃圾的时候, 在回收key的时候, 就可以将value也回收, 这样就不会有内存溢出?
能详细的解答一下我的疑问吗? 最好能用生活中的例子说明一下
@PostMapping("/book")
public ResponseResult book(@RequestBody OrderRequest orderRequest, HttpServletRequest httpServletRequest) {
能详细的解答一下以上代码吗? 特别是为什么需要加@RequestBody呢? 最好能用生活中的例子说明一下
在java中的线程池是如何工作的? 线程池是如何调度的, 当有一个任务过来的时候, 是如何交给线程池来处理的, 并且线程池有任务队列吗?
是不是任务交给队列, 线程池的线程到队列里面来拿任务去执行. 能详细的讲解一下吗? 最好能用生活中的例子说明一下