Наблюдаемый результат верен, поскольку вы создаете три отдельных экземпляра Task
, которые имеют свою собственную копию переменной name
.
Таким образом, хотя они volatile
, значения не обновляются другими потоками, поток, выполняющий конкретный экземпляр, является тем, который обновляет поле v1
.
Если v1
становится статическим, затем становится членом class
, поэтому, очевидно, потоки обновят ту же копию переменной v1
.
Вместо использования synchronized
в методе run
, мы можем использоватьAtomicInteger
для безопасного обновления и извлечения значения.
class Task implements Runnable{
private final AtomicInteger v1 = new AtomicInteger(10);
private String name;
public void run() {
System.out.println("Thread is: " + Thread.currentThread().getName() + " " + v1.addAndGet(10));
}
}
public class ThreadPoolTest{
public static void main(String[] args) {
Runnable r1 = new Task();
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.execute(r1);
executor.execute(r1);
executor.execute(r1);
executor.shutdown();
}
}