Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不同步运行java方法?_Java_Multithreading - Fatal编程技术网

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

为什么不同步运行java方法?,java,multithreading,Java,Multithreading,我正在做一个关于Java线程的短期课程,在我的一个家庭作业中,他们问我:?为什么不同步run方法?举个例子 我搜索了一下,我认为使用synchronized for run方法是没有用的,至少在一般情况下是没有用的。因为用户不手动调用run方法,所以使用synchronized run创建对象的多个实例时,同步效果不可见 因此,我想知道是否存在其他原因,或者我是否错了。同步Runnable的run()方法是完全没有意义的,除非您希望在多个线程之间共享Runnable,并且希望序列化这些线程的执行

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

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


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

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

如果
Runnable
run
方法是
同步的
,那么

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


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

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

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

    }
}
公共类同步运行{
静态抽象类Future实现可运行{
私人T值;
公共同步的T getValue(){
返回值;
}
受保护的无效设置值(T val){
值=val;
}
}
公共静态void main(字符串[]args){
Future longRunningJob=新未来(){
@凌驾
已同步的公共void运行(){
试一试{
睡眠(5000);
设定值(42);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
};
新线程(longRunningJob).start();
System.out.println(“获取结果”);
System.out.println(“result=“+longRunningJob.getValue());
}
}

谢谢你,我的朋友。谢谢你,我的朋友。