用了ThreadLocal还是有重复值

用了ThreadLocal还是有重复值

相关代码:

package thread_learn;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadStringBuilder {
public static ExecutorService executorService = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
int fianl = i;
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(ThreadSafeStringBuilder.getString(fianl));
}
});
}
}
}

相关代码:

​package thread_learn;

public class ThreadSafeStringBuilder {
public static ThreadLocal<StringBuilder> stringBuilderThreadLocal = ThreadLocal.withInitial(() -> new StringBuilder());


public static String getString(int number) {
StringBuilder stringBuilder = ThreadSafeStringBuilder.stringBuilderThreadLocal.get();
stringBuilder.append("数字" + number+" ");
stringBuilder.append(Thread.currentThread().getName());
return stringBuilder.toString();
}

}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕阿满 2021-06-15 16:58:07

同学你好,数据是在线程池创建时绑定在线程上的,线程池中的线程是会重复利用的,所以会可能会出现多个任务可能会使用同一个 ThreadLocal,造成线程安全问题,解决方法,在使用ThreadLocal使用前,使用remove()方法移除除掉之前的其他线程产生的数据,如:

http://img1.sycdn.imooc.com//climg/60c86b9909543eb108120348.jpg

祝学习愉快~


  • rock221 #1

    是因为threadLocal是静态的, 共享的,多个访问的话, 可能还是会出现不安全的情况,所以每次访问先清除之前的调用记录,对吧?

    2021-06-19 17:01:21
  • rock221 #2

    如果不清除, 那就和之前的statc new simpleDateFormat 一样了吧, 会出现线程安全的情况。 

    2021-06-19 17:08:28
  • 同学你好,是的,可以这么理解,如果多个访问的话可能会使用同一个 ThreadLocal,出现不安全的情况

    祝学习愉快~

    2021-06-19 19:09:17
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师