# ThreadLocal 底层如何实现
...
# ThreadLocal 为什么会内存泄露
ThreadLocal 是一个类似 HashMap 的数据结构
ThreadLocal 的实现原理就是通过 set 把 value set 到线程的 threadlocals 属性中,threadlocals 是一个 Map, 其中 key 是 ThreadLocal 的 this 引用,value 是我们 set 的值
# sleep () 和 wait () 有何区别
sleep() | wait() | |
---|---|---|
所属类不同 | Thread | Object |
方法类型不同 | 静态方法 | 实例方法 |
使用语法不同 | thread.sleep(time) | 得先拿到锁 synchronize (t) |
唤醒方式不同 | 必须传时间 time | t.notify |
释放锁资源不同 | 不释放锁资源 (就是为了让线程等待) | 释放锁资源 (协调线程同步) |
线程状态不同 | TIMED_WAITTING | WAITTING |
# 多个线程如何保证按顺序执行
- 通过 join () 方法使当前线程 "阻塞", 等待指定线程执行完毕后继续执行;
- 通过创建单一化线程池 newSingleThreadExecutor () 实现
- 通过倒数计时器 CountDownLatch 实现
- 使用 Object 的 wait/notify 方法实现
- 使用线程的 Condition (条件变量) 方法实现
- 使用线程的 CyclicBarrier (回环栅栏) 方法实现
- 使用线程的 Semaphore (信号量) 方法实现
# JAVA 线程池中 submit () 和 execute () 方法有何区别
- 两个方法都可以向线程池中提交任务
- execute 只能提交 Runnable, 无返回值
- submit 既可以提交 Runnable, 返回值为 null, 也可以提交 Callable, 返回值 Future
- execute () 方法定义在 Executor 接口中
- submit () 方法定义在 ExecutorService 接口中
- execute 执行任务遇到异常会直接抛出
- submit 执行任务时遇到异常不会直接抛出,只有调用 Future 的 get () 方法获取返回值时,才会抛出异常