คำถามติดแท็ก synchronized

16
'ทำข้อมูลให้ตรงกัน' หมายความว่าอย่างไร
ฉันมีคำถามบางอย่างเกี่ยวกับการใช้งานและความสำคัญของsynchronizedคำหลัก คำสำคัญของsynchronizedคำสำคัญคืออะไร วิธีการควรเป็นเมื่อไหร่synchronized? มันหมายถึงอะไรโดยทางโปรแกรมและเหตุผล?

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

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

4
ความแตกต่างระหว่างสารระเหยและซิงโครไนซ์ใน Java
ฉันสงสัยว่าความแตกต่างระหว่างการประกาศตัวแปรเป็นvolatileและการเข้าถึงตัวแปรในsynchronized(this)บล็อกใน Java หรือไม่? ตามบทความนี้http://www.javamex.com/tutorials/synchronization_volatile.shtmlมีหลายสิ่งที่ต้องพูดและมีความแตกต่างมากมาย แต่ก็มีความคล้ายคลึงกันบ้าง ฉันสนใจข้อมูลนี้เป็นพิเศษ: ... การเข้าถึงตัวแปรที่เปลี่ยนแปลงได้ไม่เคยมีศักยภาพในการบล็อก: เราเพียง แต่ทำการอ่านหรือเขียนอย่างง่าย ๆ เท่านั้นซึ่งแตกต่างจากบล็อกที่ซิงโครไนซ์ที่เราจะไม่ยึดติดกับล็อคใด ๆ เนื่องจากการเข้าถึงตัวแปรระเหยไม่เคยมีการล็อคจึงไม่เหมาะสำหรับกรณีที่เราต้องการอ่าน - อัปเดต - เขียนเป็นปฏิบัติการอะตอมมิก (เว้นแต่ว่าเราพร้อมที่จะ "พลาดการอัพเดท"); พวกเขาหมายถึงอะไรโดยread-update-write ? การเขียนนั้นเป็นการอัปเดตหรือหมายความว่าการอัปเดตนั้นเป็นการเขียนที่ขึ้นอยู่กับการอ่านด้วยหรือไม่ ส่วนใหญ่แล้วเมื่อใดที่เหมาะสมที่จะประกาศตัวแปรvolatileมากกว่าเข้าถึงตัวแปรเหล่านั้นผ่านsynchronizedบล็อก? เป็นความคิดที่ดีที่จะใช้volatileกับตัวแปรที่ขึ้นอยู่กับอินพุตหรือไม่? ตัวอย่างเช่นมีตัวแปรที่เรียกrenderว่าอ่านห่วงการเรนเดอร์และตั้งค่าโดยเหตุการณ์ keypress หรือไม่

2
อะไรคือสาเหตุที่ไม่อนุญาตให้ "ซิงโครไนซ์" ในวิธีส่วนต่อประสาน Java 8?
ใน 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 …

11
Java วิธีการทำข้อมูลให้ตรงกันล็อคกับวัตถุหรือวิธี?
ถ้าฉันมีวิธีการซิงโครไนส์ 2 วิธีในคลาสเดียวกัน แต่แต่ละวิธีเข้าถึงตัวแปรที่แตกต่างกัน 2 เธรดสามารถเข้าถึง 2 วิธีเหล่านั้นในเวลาเดียวกันได้หรือไม่ ล็อคเกิดขึ้นกับวัตถุหรือมีความเฉพาะเจาะจงกับตัวแปรภายในวิธีการซิงโครไนซ์หรือไม่? ตัวอย่าง: class X { private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } } 2 เธรดสามารถเข้าถึงอินสแตนซ์เดียวกันของคลาส X ที่มีประสิทธิภาพx.addA() และx.addB()ในเวลาเดียวกันได้หรือไม่

12
หากฉันซิงโครไนซ์สองวิธีในคลาสเดียวกันพวกเขาสามารถทำงานพร้อมกันได้หรือไม่?
หากฉันซิงโครไนซ์สองวิธีในคลาสเดียวกันพวกเขาสามารถทำงานพร้อมกันบนวัตถุเดียวกันได้หรือไม่? ตัวอย่างเช่น: class A { public synchronized void methodA() { //method A } public synchronized void methodB() { // method B } } ฉันรู้ว่าฉันวิ่งไม่ได้ methodA()สองครั้งบนวัตถุเดียวกันในสองเธรดที่แตกต่างกัน สิ่งเดียวกันmethodB()ค่ะ แต่ฉันสามารถเรียกใช้methodB()เธรดอื่นขณะที่methodA()ยังทำงานอยู่ได้หรือไม่ (วัตถุเดียวกัน)

8
Java คงที่วิธีการคงที่: ล็อคในวัตถุหรือชั้นเรียน
เอกสาร Java กล่าวว่า: เป็นไปไม่ได้ที่การเรียกใช้วิธีการซิงโครไนซ์สองครั้งบนวัตถุเดียวกันเพื่อแทรกสอด สิ่งนี้หมายความว่าสำหรับวิธีการคงที่? เนื่องจากวิธีการคงที่ไม่มีวัตถุที่เกี่ยวข้องคำหลักที่ถูกซิงโครไนซ์จะล็อคในชั้นเรียนแทนที่จะเป็นวัตถุหรือไม่

4
Java Synchronized Block สำหรับ. class
รหัสจาวาหมายถึงอะไร? จะได้รับการล็อควัตถุทั้งหมดของMyClass? synchronized(MyClass.class) { //is all objects of MyClass are thread-safe now ?? } และโค้ดด้านบนแตกต่างจากโค้ดนี้อย่างไร: synchronized(this) { //is all objects of MyClass are thread-safe now ?? }

8
การซิงโครไนซ์ฟิลด์ที่ไม่ใช่ขั้นสุดท้าย
คำเตือนจะแสดงทุกครั้งที่ฉันซิงโครไนซ์ในฟิลด์คลาสที่ไม่ใช่คลาสสุดท้าย นี่คือรหัส: public class X { private Object o; public void setO(Object o) { this.o = o; } public void x() { synchronized (o) // synchronization on a non-final field { } } } ดังนั้นฉันจึงเปลี่ยนการเข้ารหัสด้วยวิธีต่อไปนี้: public class X { private final Object o; public X() { o = new Object(); …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.