我正在做一个关于Java中的Threads的简短课程,在我的一个作业中他们问我:¿为什么你不应该同步run方法?举个例子。
我搜索了它,并且我认为对于run方法使用synchronized是无用的,至少是常见的。因为人们不会手动调用run方法,所以同步效果不可见,创建具有同步运行的对象的多个实例。
所以,我想知道是否存在其他原因或者我是错的。
答案 0 :(得分:1)
同步Runnable的run()方法是完全没有意义的,除非你想在多个线程之间共享Runnable并且你想序列化这些线程的执行。这基本上是一个矛盾。
答案 1 :(得分:1)
如果run
的{{1}}方法是Runnable
,那么
a)你有很多runnables(在这种情况下,不需要同步,因为每个都在不同的对象上调用),或者
b)你在许多线程中调用了一个runnable - 但是它们显然不会并行运行 - 从而无法实现拥有多个线程的目的!答案 2 :(得分:1)
你可以在run方法上同步,没有任何问题。我认为这个建议背后的原因当然应由导师解释。
this
上的同步相同,这将阻止其他方法调用。 作为一个反例,一个穷人的未来实施;
public class SynchronizedRun {
static abstract class Future<T> implements Runnable{
private T value;
public synchronized T getValue(){
return value;
}
protected void setValue(T val){
value = val;
}
}
public static void main(String[] args) {
Future<Integer> longRunningJob = new Future<Integer> (){
@Override
synchronized public void run() {
try {
Thread.sleep(5000);
setValue(42);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
new Thread(longRunningJob).start();
System.out.println("getting results");
System.out.println("result = " + longRunningJob.getValue());
}
}