ในสภาพแวดล้อมแบบมัลติเธรด เธรดตั้งแต่สองเธรดขึ้นไปสามารถเข้าถึงทรัพยากรที่ใช้ร่วมกันได้พร้อมกัน ซึ่งอาจทำให้เกิดพฤติกรรมที่ไม่สอดคล้องกันของระบบ Java ใช้แนวคิดของการล็อกเพื่อจำกัดการเข้าถึงทรัพยากรหรืออ็อบเจ็กต์ที่แบ่งใช้พร้อมกัน ล็อคสามารถใช้ได้ในสองระดับ -
- Object Level Locks − สามารถใช้ได้เมื่อคุณต้องการวิธีที่ไม่คงที่หรือบล็อกที่ไม่คงที่ของโค้ดควรเข้าถึงได้ด้วยเธรดเดียวเท่านั้น
- การล็อกระดับคลาส − สามารถใช้ได้เมื่อเราต้องการป้องกันไม่ให้หลายเธรดเข้าสู่บล็อกที่ซิงโครไนซ์ในอินสแตนซ์ใดๆ ที่มีอยู่ทั้งหมดบนรันไทม์ ควรใช้เพื่อทำให้เธรดข้อมูลแบบคงที่ปลอดภัยเสมอ
ซีเนียร์ เลขที่ | คีย์ | การล็อกระดับวัตถุ | การล็อกระดับคลาส |
---|---|---|---|
1 | พื้นฐาน | สามารถใช้ได้เมื่อคุณต้องการวิธีการแบบ non-static หรือบล็อค non-static ของโค้ดที่ควรเข้าถึงโดยเธรดเดียวเท่านั้น | สามารถใช้เมื่อเราต้องการป้องกันไม่ให้หลายเธรดเข้าสู่บล็อกที่ซิงโครไนซ์ในอินสแตนซ์ที่มีอยู่ทั้งหมดบนรันไทม์ |
2 | คงที่/ไม่คงที่ | ควรใช้เพื่อทำให้เธรดข้อมูลที่ไม่คงที่ปลอดภัยเสมอ | ควรใช้เพื่อทำให้เธรดข้อมูลแบบคงที่ปลอดภัยเสมอ
|
3 | จำนวนล็อค | ทุกวัตถุในชั้นเรียนอาจมีล็อคของตัวเอง | อาจมีออบเจ็กต์ของคลาสหลายตัว แต่จะมีการล็อกอ็อบเจ็กต์คลาสของคลาสหนึ่งเสมอ |
ตัวอย่างการล็อกระดับคลาส
public class ClassLevelLockExample { public void classLevelLockMethod() { synchronized (ClassLevelLockExample.class) { //DO your stuff here } } }
ตัวอย่างการล็อกระดับวัตถุ
public class ObjectLevelLockExample { public void objectLevelLockMethod() { synchronized (this) { //DO your stuff here } } }