【问题标题】:Thread safe calling a TimerTask from within another Thread线程安全地从另一个线程中调用 TimerTask
【发布时间】:2019-11-28 23:15:05
【问题描述】:

我有一个实现可运行的类 ABC。 ABC 有多个线程在运行。在每个线程中我想安排一个 TimerTask。在这个 TimerTask 块中调用的函数对于线程的变量需要是线程安全的。

public class ABC implements Runnable {
private int abc = 0;

public void run() {

    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            this.someFunc();
        }
    }, 1000, 1000);
    while (true) {
        abc = (abc + 1) % 20;
    }



}

void someFunc() {
    abc--;
}
}

这个线程是安全的还是我需要使 someFunc() 成为一个同步函数?

【问题讨论】:

  • 不。它不是。您不需要使someFunc 同步。如果您愿意,可以通过其他方式处理此问题(AtomicInteger 等)。

标签: java multithreading timer thread-safety timertask


【解决方案1】:

Javadoc 说:

公共类计时器 扩展对象

一种用于线程调度任务以供将来在后台线程中执行的工具。

由于它在后台线程中运行,因此不是线程安全的。

someFunc() 是否应该是 synchronized 函数取决于它的作用,使其 synchronized 不会自动保证线程安全。

【讨论】:

  • 假设这是我要运行的代码。使 someFunc() 同步可以保证线程安全吗?
  • 如果你使someFunc()同步,它将使用属于ABC实例的互斥锁。由于someFunc() 修改了abc,因此您还需要在while (true) 循环内的同一实例上进行同步(参见此处:tutorials.jenkov.com/java-concurrency/…)。
最近更新 更多