ถึงเวลาที่จะเลิกซิงโครไนซ์รอและแจ้งเตือนหรือไม่


13

มีสถานการณ์หนึ่ง (นอกเหนือจากความเข้ากันได้กับ JVM โบราณ) ที่ใช้synchronizedเป็นที่ต้องการใช้Lockหรือไม่ ใครสามารถแสดงให้เห็นถึงการใช้waitหรือnotifyมากกว่าระบบที่ใหม่กว่า?

มีอัลกอริทึมที่ต้องใช้หนึ่งในนั้นในการนำไปใช้หรือไม่

ฉันเห็นคำถามก่อนหน้านี้ที่แตะต้องเรื่องนี้ แต่ฉันอยากจะใช้เวลาเพิ่มอีกนิดและจริง ๆ แล้วdeprecateพวกเขา มีกับดักและหลุมพรางและข้อผิดพลาดอยู่มากเกินไปกับสิ่งที่ถูกรีดออกด้วยสิ่งอำนวยความสะดวกใหม่ ฉันแค่รู้สึกว่าอาจถึงเวลาที่จะทำเครื่องหมายพวกเขาล้าสมัย


4
คุณอ่าน Java Concurrency ของ Brian Goetz ในทางปฏิบัติแล้วหรือยัง? เขาครอบคลุมการอภิปรายอย่างชัดเจนโดยนัยกับการล็อคอย่างชัดเจน
Martijn Verburg

@ MartijnVerburg - น่าเสียดายที่ไม่มี แต่ฉันมีความเคารพอย่างมากสำหรับการทำงานของเขา
OldCurmudgeon

1
คำหลักที่ซิงโครไนซ์อาจมีประโยชน์ด้วยวิธีการแบบคงที่อย่างง่ายซึ่งควรเป็นเธรดที่ปลอดภัยสำหรับสิ่งอื่นที่ฉันจะใช้พร้อมกัน แต่นี่เป็นความเห็นของฉัน
Kemoda

คำตอบ:


12

มีอัลกอริทึมที่ต้องใช้หนึ่งในนั้นในการนำไปใช้หรือไม่

แทบจะไม่แน่นอน (แน่นอนจากมุมมองทางทฤษฎีคุณควรจะสามารถจำลองการรอ / แจ้งเตือนโดยใช้ java.util.concurrent .. class. อื่น ๆ และการซิงโครไนซ์อาจถูกแทนที่ด้วยการดำเนินการล็อคอย่างชัดเจน ... แม้ว่าคุณจะต้องระมัดระวังในการปลดล็อกfinallyคำสั่ง.)

อย่างไรก็ตามอาจมีอัลกอริทึมที่การใช้งานที่ดีที่สุดใน Java เกี่ยวข้องกับการใช้งานการซิงโครไนซ์โดยตรงโดยมีหรือไม่มีการรอและการแจ้งเตือน


ถึงเวลาที่จะเลิกซิงโครไนซ์รอและแจ้งเตือนหรือไม่

โดยไม่คำนึงถึงคำตอบของคำถามก่อนหน้าคำตอบคือไม่แน่นอน

การรอ / แจ้งเตือนสามารถใช้ (และบ่อยครั้ง) ได้อย่างถูกต้อง ใน Java การคัดค้านถูกสงวนไว้สำหรับคลาสและเมธอดที่ใช้งานไม่ได้ เช่นในกรณีที่การใช้งานอย่างต่อเนื่องควรได้รับการแก้ไขเป็นเรื่องเร่งด่วน หากซัน (และตอนนี้ Oracle) เลิกใช้งานสิ่งพื้นฐานและใช้กันอย่างแพร่หลายเช่นรอ / แจ้งพวกเขาจะสร้างปัญหาความเข้ากันได้อย่างร้ายแรงสำหรับรหัสมรดกจำนวนมาก นั่นไม่ได้อยู่ในความสนใจของใคร

หากคุณต้องการกำจัดการซิงโครไนซ์ / รอ / แจ้งเตือนในรหัสของคุณนั่นก็ดี แต่การคัดค้านเรียกร้องให้มีการเขียนรหัสมัลติเธรดที่ถูกต้องจำนวนมากและนั่นก็คือ BAD IDEA ผู้จัดการฝ่ายไอทีขององค์กรและผู้จัดการผลิตภัณฑ์ซอฟต์แวร์จะเกลียดคุณในการแนะนำ ...


ควรอ่านความหมายของคำว่า "คัดค้าน" ตามเอกสาร Java: http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

และโปรดทราบด้วยว่าเรากำลังพูดถึงการลดค่าสิ่งที่เป็นหัวใจของภาษาจาวา การเลิกsynchronizedมีผลกระทบอย่างมาก


ตามจริงแล้วฉันจำได้ว่าตามหนังสือ“ Java เห็นพ้องด้วยกันในทางปฏิบัติ” ที่ยอดเยี่ยมjava.util.concurrentชั้นเรียนที่ใช้จริงเร็วกว่า เบื้องหลังเหล่านี้คลาสเหล่านี้จะพูดคุยกับ VM โดยตรงในฐานะที่เป็นซิงโครไนซ์ติดตั้งล็อคทื่อบนวัตถุในกราฟวัตถุและทำให้ส่งผลกระทบต่อประสิทธิภาพการทำงานทั่วโลก
akuhn

ยกโทษให้ฉัน @ สตีเฟ่นถ้าฉันเจอว่าแนะนำให้เราลบsynchronizedet อัล ฉันแค่แนะนำการคัดค้านซึ่งจริงๆแล้วบอกว่าอย่าใช้สิ่งนี้กับรหัสใหม่ ฉันจะไม่ฝันที่จะแนะนำการทดสอบที่เสียหายและทดสอบรหัสเดิมที่ฉันต้องการให้เอาออก
OldCurmudgeon

@ OldCurmudgeon - เป็นการตอบกลับที่ช้ากว่า แต่ฉันคิดว่าการคัดค้านนั้นรุนแรงเกินไป 1) หมายความว่าสามารถลบคุณลักษณะได้ 2) แสดงว่าฟีเจอร์นั้นแตกต่างจากแบบเก่า ๆ เท่านั้น 3) ผู้คนจำนวนมากยังคงมีความสุขที่จะเขียนรหัสใหม่ด้วยวิธีนี้ ... และไม่มีเหตุผลที่ดีที่พวกเขาไม่ควร 4) มีวิธีอื่น ๆ น้อยลง "ในหน้าของคุณ" เพื่อกีดกัน; เช่นการเขียนกฎ PMD ...
Stephen C

@StephenC - มีการกระทำที่น่าทึ่งน้อยกว่าเล็กน้อยที่เราสามารถทำได้ซึ่งจะส่งผลให้พวกเขาไม่ได้ใช้หรือสอนในวิทยาลัย ควรหลีกเลี่ยงอย่างชัดเจน ฉันสงสัยว่ากฎ PMD - ถึงแม้ว่าเป็นความคิดที่ดี - จะไม่เข้าถึงครูอย่างรวดเร็ว
OldCurmudgeon

1
@StephenC nitpick: ดำเนินการโดยเอกสาร Java ที่คุณเชื่อมโยงกับฉันไม่คิดว่าการคัดค้านหมายความว่ารหัสที่เลิกใช้แล้วไม่ทำงาน นั่นเป็นเหตุผลหนึ่ง แต่อย่างที่เอกสารบอกว่า API สามารถเลิกใช้ได้เมื่อถูกแทนที่ด้วย API ที่ใหม่กว่าและดีกว่า (เช่น OP แย้งเป็นกรณีที่เกิดขึ้นพร้อมกัน) และเห็นพ้องในระดับต่ำถ้าไม่จริงให้กำลังใจการปฏิบัติที่ไม่ดีแน่นอนมากข้อผิดพลาดง่าย
Andres F.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.