ThreadLocal导致系统陷入死锁的案例
时间: 2023-05-24 22:06:48 浏览: 185
由于ThreadLocal只在当前线程内起作用,因此在线程池等场景下使用时需要特别注意,避免ThreadLocal导致的死锁问题。
以下是一个示例代码,该代码使用了ThreadLocal来保存线程特有的对象,同时在使用线程池时,由于线程重用导致ThreadLocal中的对象无法正确释放,最终导致系统死锁。
```
public class ThreadLocalDeadLockDemo {
static ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0,
TimeUnit.SECONDS, new LinkedBlockingDeque<>(10), r -> {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
});
static ThreadLocal<Map<String, String>> threadLocal = new ThreadLocal<Map<String,String>>(){
protected Map<String, String> initialValue(){
return new HashMap<>();
}
};
public static void main(String[] args) throws Exception {
//提交一个任务,该任务会占用ThreadLocal中的对象
executor.execute(() -> {
threadLocal.get().put("test", "value");
//模拟业务逻辑执行的过程
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
threadLocal.get().remove("test");
});
//提交一个任务,会尝试获取ThreadLocal对象
executor.execute(() -> {
Map<String, String> map = threadLocal.get();
//模拟对ThreadLocal对象的操作,由于上一个任务还未释放对象,导致无法获取到对象,进而导致线程死锁
System.out.println(map.get("test"));
});
executor.shutdown();
}
}
```
当运行该程序时,会发现程序陷入死锁状态,输出结果停留在“value”处,无法继续执行。
因此,在使用ThreadLocal时,需要慎重考虑其使用场景,避免出现死锁等问题。
阅读全文