เมื่อใดก็ตามที่มีคำถามปรากฏขึ้นบน SO เกี่ยวกับการซิงโครไนซ์ Java บางคนมีความกระตือรือร้นที่จะชี้ให้เห็นว่าsynchronized(this)
ควรหลีกเลี่ยง แต่พวกเขาอ้างว่าต้องการล็อคตัวอ้างอิงส่วนตัวแทน
เหตุผลบางประการที่กำหนดคือ:
- รหัสความชั่วร้ายบางอย่างอาจขโมยล็อคของคุณ (เป็นที่นิยมมากรหัสนี้มีตัวแปร "โดยไม่ตั้งใจ")
- วิธีการทำข้อมูลให้ตรงกันทั้งหมดภายในชั้นเดียวกันใช้ล็อคเดียวกันแน่นอนซึ่งช่วยลดปริมาณงาน
- คุณกำลังเปิดเผยข้อมูลมากเกินไปโดยไม่จำเป็น
คนอื่นรวมถึงฉันเถียงว่าsynchronized(this)
เป็นสำนวนที่ใช้บ่อยๆ (เช่นในห้องสมุด Java) มีความปลอดภัยและเข้าใจดี ไม่ควรหลีกเลี่ยงเพราะคุณมีข้อผิดพลาดและคุณไม่รู้ว่าเกิดอะไรขึ้นในโปรแกรมแบบมัลติเธรดของคุณ กล่าวอีกนัยหนึ่ง: ถ้ามันใช้ได้แล้วใช้มัน
ฉันสนใจที่จะเห็นตัวอย่างในโลกแห่งความเป็นจริง (ไม่มีสิ่งใดสำหรับ foobar) ที่หลีกเลี่ยงการล็อกบนthis
จะดีกว่าเมื่อsynchronized(this)
จะทำงาน
ดังนั้น: คุณควรหลีกเลี่ยงsynchronized(this)
และแทนที่ด้วยล็อคในการอ้างอิงส่วนตัวหรือไม่?
ข้อมูลเพิ่มเติมบางส่วน (อัปเดตเมื่อได้รับคำตอบแล้ว):
- เรากำลังพูดถึงการประสานอินสแตนซ์
- ทั้งโดยนัย (
synchronized
วิธีการ) และรูปแบบที่ชัดเจนในการsynchronized(this)
ได้รับการพิจารณา - หากคุณอ้างถึง Bloch หรือหน่วยงานอื่น ๆ ในเรื่องนี้อย่าปล่อยชิ้นส่วนที่คุณไม่ชอบ (เช่น Java ที่มีประสิทธิภาพ, รายการเกี่ยวกับความปลอดภัยของกระทู้: โดยปกติแล้วมันจะล็อคตัวอินสแตนซ์เอง แต่มีข้อยกเว้น)
- หากคุณต้องการความละเอียดในการล็อคอื่น ๆ นอกเหนือจากข้อ
synchronized(this)
เสนอsynchronized(this)
มันจะไม่สามารถใช้ได้ดังนั้นจึงไม่ใช่ปัญหา