java - 我的自定义异步任务是否应该同步访问传递给构造函数的内容?

标签 java concurrency synchronization

假设我有一个不可变的 Model 类:

class Model {
    final String id;
    Model(String id) {
        this.id = id;
    }
}

我有一个自定义Task类:

class Task extends BlaBlaTask {

    final Model model;

    Task(Model model) {
        this.model = model;
    }

    // runs on a background thread
    void doInBackground() {
        // do smth with model, e.g.:
        String id = model.id;
    }
}

并且 ModelTask 实例都是在主 UI 线程上创建的。然而,doInBackground() 是在另一个线程上运行的。这段代码有错吗?我应该添加同步吗,例如像这样的东西:

class Task extends BlaBlaTask {

    Model model;

    Task(Model model) {
        setModel(model);
    }

    // runs on a background thread
    void doInBackground() {
        // do smth with model, e.g.:
        String id = getModel().id;
    }

    private synchronized void setModel(Model m) {
        model = m;
    }

    private synchronized Model getModel() {
         return model;
    }
}

附注我正在开发 Java 1.4,代码可能可以在多核 CPU 上运行。

最佳答案

我不再熟悉 Java 1.4 的 Java 内存模型,但我不明白为什么需要同步。

如果您正在启动一个线程,那么新线程将看到您在启动该线程之前编写的所有内容。

如果您将任务传递给现有线程,则发布机制应该具备所有必要的同步功能,以确保该线程可以看到发布之前写入的所有内容。这不应该是同步任何内容的任务的工作,它应该是队列的工作(或者您用来将任务从一个线程传递到另一个线程的任何其他方式)

关于java - 我的自定义异步任务是否应该同步访问传递给构造函数的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13414800/

相关文章:

java - try-with-resource资源创建的执行顺序

java - VariableDeclarationFragment 节点 resolveBindind() 在 eclipse/jdt/ast 中返回 null

java - java中的通配符和类型参数边界

java - 确保当一个线程更新 map 时,另一个线程将看到此更新的最简单方法是什么?

java - 变量的范围以 while 循环结束

c++ - 整数读取需要临界区保护吗?

scala - akka:组合来自多个 child 的消息的模式

cuda - 在 CUDA __device__ 函数的开始或结束处是否存在隐式屏障同步?

java - 这种不同步的对象池实现是否良好/安全?

java - java并发中的同步块(synchronized block)/方法和调度规则