Java并发:奇怪的输出

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)

现在这令人困惑.为什么即使每个任务完全相同,值也会有所不同?

Tho*_*ger 5

如果Runnable在添加所有Runnables 之前完成,CachedThreadPoolExecutor将重用线程.如果发生这种情况ThreadLocal,该线程也将被重用.