Saturday, April 4, 2020

Ví dụ đa luồng trong java

Bế tắc đến theo chủ đề đồng thời. Tôi đã chia sẻ các câu hỏi và câu trả lời phỏng vấn đa luồng tại đây. Gần đây tôi đã đưa ra một vài cuộc phỏng vấn java, nơi tôi phải đối mặt với chương trình câu hỏi để tạo ra sự bế tắc giữa hai luồng trong java hai lần. Hãy chắc chắn rằng câu hỏi này nằm trong danh sách việc cần làm của bạn, đặc biệt nếu bạn sẽ phỏng vấn các ngân hàng đầu tư như Goldman Sachs, Bank of America, Morgan Stanley, v.v. Hãy hiểu về cuộc phỏng vấn và trước tiên hãy hiểu Deadlock là gì.

Bế tắc là gì?

Khi từ khóa được đồng bộ hóa trong java làm cho luồng thực thi bị chặn trong khi chờ màn hình (khóa) được liên kết với đối tượng được chỉ định, thì Bế tắc có thể xảy ra. Vì luồng thực thi có thể đã giữ đối tượng được yêu cầu bởi luồng khác (cũng trong trạng thái chờ). Trong trường hợp như vậy, hai luồng kết thúc chờ đợi mãi mãi cho khóa đối tượng khác.

Chương trình đa luồng trong java

public class DeadLockProgram {
    // Creating Object Locks
    static Object ObjectLock1 = new Object();
    static Object ObjectLock2 = new Object();
 
    private static class ThreadName1 extends Thread {
      public void run() {
         synchronized (ObjectLock1) {
            System.out.println("Thread 1: Has  ObjectLock1");
            /* Adding sleep() method so that
               Thread 2 can lock ObjectLock2 */
            try {
                Thread.sleep(100);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread 1: Waiting for ObjectLock 2");
            /*Thread 1 has ObjectLock1
              but waiting for ObjectLock2*/
            synchronized (ObjectLock2) {
               System.out.println("Thread 1: No DeadLock");
            }
         }
      }
   }
   private static class ThreadName2 extends Thread {
      public void run() {
         synchronized (ObjectLock2) {
            System.out.println("Thread 2: Has  ObjectLock2");
            /* Adding sleep() method so that
               Thread 1 can lock ObjectLock1 */
            try {
                Thread.sleep(100);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread 2: Waiting for ObjectLock 1");
            /*Thread 2 has ObjectLock2
              but waiting for ObjectLock1*/
            synchronized (ObjectLock1) {
               System.out.println("Thread 2: No DeadLock");
            }
         }
      }
   }
 
   public static void main(String args[]) {
      ThreadName1 thread1 = new ThreadName1();
      ThreadName2 thread2 = new ThreadName2();
      thread1.start();
      thread2.start();
   }
}
Kết quả:
Thread 1: Has  ObjectLock1
Thread 2: Has  ObjectLock2
Thread 1: Waiting for ObjectLock 2
Thread 2: Waiting for ObjectLock 1

No comments:

Post a Comment