为什么在 synchronized 之前使用 void 关键字会在 Java 中引发错误,但反过来却可以正常工作?

Why does using void keyword before synchronized throws an error in Java, but the reverse works fine?

import java.util.*;

public class Deadlock extends Thread{

    private String name;    

    public static void main(String[] args) {        

    }

    public class MyObject{
        public void synchronized foo(String name) { //throws error saying 'Syntax error on token "void", volatile expected' 

        }       
    }   
}

但是如果,public void synchronized改为 public synchronized void,一切都很好。

这是为什么?

查看 Java 规范 8.4.3. Method modifiers 上面写着:

MethodModifier:
    (one of) 
    Annotation public protected private 
    abstract static final synchronized native strictfp

那些必须在 return 类型之前,它是最后一个。修饰符顺序并不重要,因为它们尊重 return 类型作为最后一个。这就是 public synchronized void 有效的原因。

你在return什么?您 return 是同步的,还是 return 无效的?由于 synchronized 不是你可以 return 的东西,它必须是无效的。你看,return 类型必须始终紧跟在函数名称之前。