Lin*_*nas 1 java concurrency multithreading
我正在使用Java线程,我编写了这个创建多个线程并运行它们的小程序.在每个线程中,值会多次递增.我使用了ThreadLocal类,因此没有争用资源.
资源:
class MyValueHolder {
public static ThreadLocal<Integer> value = new ThreadLocal<Integer>()
{
protected Integer initialValue() {
return 0;
}
};
public static void increment() {
value.set(value.get() + 1);
}
public static Integer get() {
return value.get();
}
}
class MyTask implements Runnable {
public static int counter;
public MyTask() {
counter++;
}
public void run() {
for(int i = 0; i < 100; i++) {
MyValueHolder.increment();
}
System.out.println("MyTask " + counter + ", Value " + MyValueHolder.get());
}
}
public class Main {
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool();
for(int i = 0; i < 5; i++) {
es.execute(new MyTask());
}
es.shutdownNow();
}
}
Run Code Online (Sandbox Code Playgroud)
完成后输出大部分时间是这样的:
MyTask 5, Value 100
MyTask 5, Value 100
MyTask 5, Value 100
MyTask 5, Value 100
MyTask 5, Value 100
Run Code Online (Sandbox Code Playgroud)
这是我期望看到的.
但是,有时我得到这样的东西:
MyTask 2, Value 100
MyTask 4, Value 200
MyTask 5, Value 300
MyTask 5, Value 100
MyTask 5, Value 100
Run Code Online (Sandbox Code Playgroud)
现在这令人困惑.为什么即使每个任务完全相同,值也会有所不同?
如果Runnable在添加所有Runnables 之前完成,CachedThreadPoolExecutor将重用线程.如果发生这种情况ThreadLocal,该线程也将被重用.