假设我有一个不可变的 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;
}
}
并且 Model
和 Task
实例都是在主 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/