有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程为什么不同步java运行方法?

我正在做一个关于Java线程的短期课程,在我的一个家庭作业中,他们问我:?为什么不同步run方法?举个例子

我搜索了一下,我认为使用synchronized for run方法是没有用的,至少在一般情况下是没有用的。因为用户不手动调用run方法,所以使用synchronized run创建对象的多个实例时,同步效果不可见

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


共 (3) 个答案

  1. # 1 楼答案

    同步Runnable的run()方法是完全没有意义的,除非您希望在多个线程之间共享Runnable,并且希望序列化这些线程的执行。这基本上是一种矛盾

  2. # 2 楼答案

    如果Runnablerun方法是synchronized,则

    a)您有许多可运行程序(在这种情况下,不需要同步,因为每个可运行程序都在不同的对象上调用),或者

    b)在多个线程中调用一个runnable,但是它们显然不会并行运行,因此无法实现拥有多个线程的目的

  3. # 3 楼答案

    您可以在运行时同步方法,但没有问题。我认为这个建议背后的原因当然应该由讲师向你解释

    • 当存在共享资源(线程之间)时,我们需要同步
    • 在方法上同步与在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());
    
        }
    }