Java 8에서는 다음과 같이 쉽게 작성할 수 있습니다.
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
클래스에서도 사용할 수있는 전체 동기화 의미론을 얻습니다. 그러나 synchronized
메소드 선언에 수정자를 사용할 수는 없습니다 .
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
이제 한 것을 제외하고 같은 방식의 행동이 인터페이스를 주장 할 수 Interface2
설정 계약 에 method1()
와에 대한 method2()
것보다 조금 더 강한, Interface1
수행합니다. 물론 우리는 default
구현이 구체적인 구현 상태에 대해 어떤 가정도해서는 안되거나 그러한 키워드가 단순히 무게를 풀지 않을 것이라고 주장 할 수 있습니다 .
질문:
JSR-335 전문가 그룹이 synchronized
인터페이스 방법 을 지원하지 않기로 결정한 이유는 무엇입니까 ?
default synchronized
아직 필요하지를 들어, static synchronized
나는 후자의 힘이 일관성을 이유로 생략 한 것을 받아 들일 있지만.
synchronized
하위 클래스에서 수정자가 재정의 될 수 있으므로이 질문에 값이 추가되는지 확실하지 않으므로 최종 기본 메소드와 같은 것이 있으면 중요합니다. (다른 질문)
synchronized
수퍼 클래스에서 선언 된 메소드를 대체 하여 효과적으로 동기화를 제거 할 수 있습니다. 그러나 다중 상속 (예 : 상속 및 등)으로 인해 synchronized
지원 하지 않고 지원 하지 않는 final
것이 관련 되어 있다는 사실에 놀라지 않을 것 입니다. 그러나 그것은 추측입니다. 권위있는 이유가 있다면 궁금합니다. void x()
synchronized void x()
super
할 수 있습니다." Btw에는 이러한 메소드를 "디펜더"라고하는 이유가 있습니다. 새로운 메소드를 쉽게 추가 할 수 있습니다.