为什么不同步run方法java?

时间:2015-09-07 21:56:40

标签: java multithreading

我正在做一个关于Java中的Threads的简短课程,在我的一个作业中他们问我:¿为什么你不应该同步run方法?举个例子。

我搜索了它,并且我认为对于run方法使用synchronized是无用的,至少是常见的。因为人们不会手动调用run方法,所以同步效果不可见,创建具有同步运行的对象的多个实例。

所以,我想知道是否存在其他原因或者我是错的。

3 个答案:

答案 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());

    }
}