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. Модификаторы метода, в которой говорится:
MethodModifier:
(one of)
Annotation public protected private
abstract static final synchronized native strictfp
Они должны предшествовать возвращаемому типу, который идет последним. Порядок модификаторов на самом деле не имеет значения, поскольку они учитывают, что возвращаемый тип является последним. Вот почему public synchronized void
действителен.
Понятно. Итак, спецификация.
Что ты возвращаешься? Вы возвращаете синхронизированный или вы возвращаете пустоту? Поскольку вы не можете вернуть синхронизацию, она должна быть недействительной. Видите ли, тип возвращаемого значения всегда должен стоять непосредственно перед именем функции.
Поскольку возвращаемый тип должен стоять непосредственно перед именем метода — это часть подписи метода. Все модификаторы должны предшествовать подписи и могут появляться в любом порядке. Попробуйте поменять местами
public
иsynchronized
— это то же самое.