about lock
关于锁有三个标准:
1,能否正确做到互斥
2,能否做到公平(有些人处于饥饿状态)
3,能否有效率,不要死循环去查询锁是否就绪了
load-and-store
最简单的锁就是尝试去设置一本变量的位,其他的人则死循环等待
test-and-set
就是一个原子的是不是0位然后设置为1,这个锁有个问题就是
compare-and-swap
void lock(lock_t *lock) {
while (CompareAndSwap(&lock->flag, 0, 1) == 1)
; // spin
}
由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用。
因此在每次使用完ThreadLocal 之后,都要调用它的remove()方法,清除数据。
在使用线程池的情况下,没有及时清理ThreadLocal,不仅是内存泄漏的问题,更严重的是可能导致业务逻辑出现问题。
所以,使用ThreadLocal就跟加锁完要解锁一样,用完就清理。
java的lock是一个接口,一般使用reentrablelock来实现,