ใน 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
ฟายเออร์อาจจะ overriden ในคลาสย่อยดังนั้นมันจะสำคัญถ้ามีบางอย่างที่เป็นวิธีการเริ่มต้นขั้นสุดท้าย (คำถามอื่น ๆ ของคุณ)
synchronized
ในคลาสซุปเปอร์ ฉันจะไม่แปลกใจเลยที่การไม่สนับสนุนsynchronized
และไม่สนับสนุนfinal
นั้นอาจเกี่ยวข้องกับมรดกหลายอย่าง (เช่นการสืบทอดvoid x()
และ synchronized void x()
อื่น ๆ ) แต่นั่นคือการเก็งกำไร ฉันอยากรู้เกี่ยวกับเหตุผลที่เชื่อถือได้หากมี
super
ซึ่งต้องมีการใช้งานเต็มรูปแบบและการเข้าถึงที่เป็นไปได้ให้กับสมาชิกส่วนตัว Btw มีเหตุผลที่วิธีการเหล่านั้นเรียกว่า "ผู้พิทักษ์" - พวกเขานำเสนอเพื่อให้ง่ายต่อการเพิ่มวิธีการใหม่