Потоковое значение глобальной переменной безопасно внутри реализации Runnable? - PullRequest
0 голосов
/ 10 февраля 2020

Я наблюдаю такое поведение, когда у меня есть собственная реализация интерфейса Runnable, а значение глобальной переменной остается поточно-ориентированным в нескольких моих тестах.

public class MyRunnable implements Runnable {

private String taskName;

private int executeCount = new Random().nextInt(10);

public MyRunnable(String taskName) {
    this.taskName = taskName;
}

@Override
public void run() {
    System.out.println(this.taskName + " in Thread ID: " + Thread.currentThread().getId() + ". execute count: " + ++executeCount);
}
}

Я запускаю 10 потоков и выполняю свой код одновременно. Каким-то образом значение executeCount остается безопасным, и я вижу ожидаемое значение.

Это сообщение? Каждый раз, когда я запускаю тест, и получается, что он печатает правильные значения, но на самом деле это небезопасно? Или поведение ожидается?

Это мой начальный этап:

@SpringBootApplication
@EnableScheduling
public class DynamicSchedularApplication implements ApplicationRunner {

public static void main(String[] args) {
    SpringApplication.run(DynamicSchedularApplication.class, args);
}

@Override
public void run(ApplicationArguments args) throws Exception {
    ThreadPoolTaskScheduler ts = threadPoolTaskScheduler();
    for (int i = 0; i < 10; i++) {
        ts.scheduleAtFixedRate(new MyRunnable("Task"+i),
            Duration.ofMillis(3000));
    }
}

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
    ThreadPoolTaskScheduler ts = new ThreadPoolTaskScheduler();
    ts.setPoolSize(10);
    return ts;
}

}

1 Ответ

1 голос
/ 10 февраля 2020

Поскольку каждый поток имеет свой собственный executeCount, который не является статическим c, и каждый поток обращается только к своему собственному executeCount, ваша программа безопасна для потоков. Неважно, что вы реализуете Runnable, важна область действия переменной и откуда она доступна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...