Они не синхронизированы друг с другом вообще.Статический метод синхронизирован на A.class
, второй - на this
.Так что (почти), как если бы вы написали:
public class A {
public static void f1() {
synchronized(A.class) {
...
}
}
public void f2() {
synchronized(this) {
...
}
}
}
, и что произойдет, если один протектор вызовет f1 (), а f1 () вызовет f2 ()
Тогда этот поток будет владеть обоими мониторами в течение f2
.Вы должны быть осторожны, прежде чем сделать это, так как если вы снимаете блокировки в обратном порядке в другом месте, вы получите тупик.
Лично я бы настоятельно призвал вас полностью избегать синхронизированных методов.Вместо этого синхронизируйте на частных, конечных полях, которые only используются для блокировки.Это означает, что только ваш класс может приобрести соответствующие мониторы, поэтому вы можете более тщательно рассуждать о том, что происходит при удержании блокировок, и избегать тупиковых ситуаций и т. Д.