Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ล็อคระดับวัตถุกับล็อคระดับคลาสใน Java?


ทั้ง การล็อกระดับออบเจ็กต์ และ ระดับชั้น k ใช้เพื่อบรรลุ การซิงโครไนซ์ กลไกในแอปพลิเคชันแบบมัลติเธรด

ล็อกระดับออบเจ็กต์

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

ตัวอย่าง

public class ObjectLevelLockTest implements Runnable {
   @Override
   public void run() {
      objectLock();
   }
   public void objectLock() {
      System.out.println(Thread.currentThread().getName());
      synchronized(this) {
         System.out.println("Synchronized block " + Thread.currentThread().getName());
         System.out.println("Synchronized block " + Thread.currentThread().getName() + " end");
      }
   }
   public static void main(String[] args) {
      ObjectLevelLockTest test1 = new ObjectLevelLockTest();
      Thread t1 = new Thread(test1);
      Thread t2 = new Thread(test1);
      ObjectLevelLockTest test2 = new ObjectLevelLockTest();
      Thread t3 = new Thread(test2);
      t1.setName("t1");
      t2.setName("t2");
      t3.setName("t3");
      t1.start();
      t2.start();
      t3.start();
   }
}

ผลลัพธ์

t1
t2
t3
Synchronized block t1
Synchronized block t3
Synchronized block t1 end
Synchronized block t3 end
Synchronized block t2
Synchronized block t2 end


ล็อกระดับคลาส

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

ตัวอย่าง

public class ClassLevelLockTest implements Runnable {
   @Override
   public void run() {
      classLock();
   }
   public void classLock() {
      System.out.println(Thread.currentThread().getName());
      synchronized(ClassLevelLockTest.class) {
         System.out.println("Synchronized block " + Thread.currentThread().getName());
         System.out.println("Synchronized block " + Thread.currentThread().getName() + " end");
      }
   }
   public static void main(String[] args) {
      ClassLevelLockTest test1 = new ClassLevelLockTest();
      Thread t1 = new Thread(test1);
      Thread t2 = new Thread(test1);
      ClassLevelLockTest test2 = new ClassLevelLockTest();
      Thread t3 = new Thread(test2);
      t1.setName("t1");
      t2.setName("t2");
      t3.setName("t3");
      t1.start();
      t2.start();
      t3.start();
   }
}

ผลลัพธ์

t3
t2
t1
Synchronized block t3
Synchronized block t3 end
Synchronized block t2
Synchronized block t2 end
Synchronized block t1
Synchronized block t1 end