编辑
2024-08-26
面试题库
0

原理:

内部锁记录: 重入锁使用一个内部的锁记录来跟踪当前持有锁的线程。

计数器: 每次线程获取锁时,计数器会增加,每次释放锁时,计数器会减少。

锁状态: 当计数器为 0 时,表示锁没有被任何线程持有;当计数器大于 0 时,表示锁被当前线程持有。

公平性: 重入锁可以选择公平性,确保按照线程请求锁的顺序来释放锁,避免线程饥饿。

特性:

可重入性: 同一个线程可以多次获取同一个锁,而不会阻塞自己。

公平性: 可以选择公平性,确保线程按照请求锁的顺序来释放锁。

锁降级: 可以将写锁降级为读锁,实现更灵活的并发控制。

锁中断: 支持中断正在等待锁的线程。

锁超时: 支持超时获取锁,如果指定时间内无法获取锁,则返回 false。

锁可关闭: 支持关闭锁,关闭锁后,所有正在等待锁的线程都会被唤醒。

编辑
2024-08-26
面试题库
0

LockSupport 是一个用于提供线程阻塞和唤醒功能的工具类,它提供了一组公共静态方法,这些方法

编辑
2024-08-26
面试题库
0

ThreadLocal 会发生内存泄漏的前提条件:

(1)线程长时间运行而没有被销毁。线程池中的 Thread 实例很容易满足此条件。

(2)ThreadLocal 引用被设置为 null,且后续在同一 Thread 实例的执行期间,没有发生对其他 ThreadLocal 实例的 get、set 或 remove 操作。

避免ThreadLocal发生内存泄漏,需要在使用完ThreadLocal后及时调用remove方法。

编辑
2024-08-26
面试题库
0

什么是弱引用?仅有弱引用(WeakReference)指向的对象,只能生存到下一次垃圾回收之前。换句话说,当 GC 发生时,不管内存够不够,仅有弱引用所指向的对象都会被回收。而拥有强引用指向的对象,则不会被直接回收。

ThreadLocalMap 中 Entry 的 Key 使用了弱引用,在下次 GC 发生时,就可以使那些没有被其他强引用指向、仅被 Entry 的 Key 所指向的 ThreadLocal 实例能被顺利回收。并且,在 Entry的 Key 引用被回收之后,其 Entry 的 Key 值变为 null。后续当 ThreadLocal 的 get、set 或 remove 被调用时,ThreadLocalMap 的内部代码会清除这些 Key 为 null 的 Entry,从而完成相应的内存释放。防止发生内存泄漏。

编辑
2024-08-26
面试题库
0

计数器:

CountDownLatch: 计数器是一次性的,当所有线程都调用 countDown() 方法后,计数器减到 0,主线程才会继续执行。之后,CountDownLatch 无法重置或修改计数器。

CyclicBarrier: 计数器是可重置的,每次执行完 await() 方法后,主线程都会继续执行,然后可以通过 reset() 方法重置计数器,使其恢复到初始值,以便再次使用。