ในสภาพแวดล้อมแบบมัลติเธรด เธรดตั้งแต่สองเธรดขึ้นไปสามารถเข้าถึงทรัพยากรที่ใช้ร่วมกันได้พร้อมกัน ซึ่งอาจทำให้เกิดพฤติกรรมที่ไม่สอดคล้องกันของระบบ 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
}
}
}