ThreadLocal测试应用

分类: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中的线程池是如何工作的? 线程池是如何调度的, 当有一个任务过来的时候, 是如何交给线程池来处理的, 并且线程池有任务队列吗? 
是不是任务交给队列, 线程池的线程到队列里面来拿任务去执行. 能详细的讲解一下吗?  最好能用生活中的例子说明一下


修改内容