Skip to main content

Command Palette

Search for a command to run...

Multi-Threading

Published
6 min readView as Markdown

Dưới đây là 20 câu hỏi phỏng vấn Java tập trung vào các chủ đề Multi-Threading bao gồm Fundamentals, Thread Safety, Mutexes vs Semaphores, Synchronized, Volatile, Wait() and Notify(), và More on Threading.

Fundamentals

  1. Câu hỏi: Thread là gì trong Java và tại sao chúng ta cần sử dụng multi-threading?

    • Trả lời: Thread là đơn vị nhỏ nhất của quá trình thực thi trong một ứng dụng. Multi-threading cho phép một chương trình thực hiện nhiều công việc đồng thời, cải thiện hiệu suất và khả năng đáp ứng của ứng dụng.
  2. Câu hỏi: Sự khác biệt giữa ThreadRunnable trong Java là gì?

    • Trả lời: Thread là một lớp đại diện cho một luồng, còn Runnable là một interface chứa phương thức run() cần được triển khai. Bạn có thể tạo một thread bằng cách kế thừa lớp Thread hoặc triển khai interface Runnable.
  3. Câu hỏi: Hãy cho ví dụ về việc tạo và chạy một thread bằng cách kế thừa lớp Thread.

    • Trả lời:

        public class MyThread extends Thread {
            public void run() {
                System.out.println("Thread is running");
            }
      
            public static void main(String[] args) {
                MyThread thread = new MyThread();
                thread.start();
            }
        }
      
  4. Câu hỏi: Hãy cho ví dụ về việc tạo và chạy một thread bằng cách triển khai interface Runnable.

    • Trả lời:

        public class MyRunnable implements Runnable {
            public void run() {
                System.out.println("Thread is running");
            }
      
            public static void main(String[] args) {
                Thread thread = new Thread(new MyRunnable());
                thread.start();
            }
        }
      

Thread Safety

  1. Câu hỏi: Thread safety là gì và tại sao nó quan trọng?

    • Trả lời: Thread safety là khả năng của một đoạn mã thực thi một cách chính xác và nhất quán khi nhiều thread truy cập đồng thời. Nó quan trọng vì đảm bảo tính toàn vẹn và nhất quán của dữ liệu, tránh các lỗi race condition.
  2. Câu hỏi: Làm thế nào để đảm bảo thread safety trong Java?

    • Trả lời: Bạn có thể đảm bảo thread safety bằng cách sử dụng các kỹ thuật như synchronized, volatile, các lớp concurrent trong Java, và sử dụng các đối tượng bất biến.

Mutexes vs Semaphores

  1. Câu hỏi: Mutex là gì và cách nó hoạt động trong multi-threading?

    • Trả lời: Mutex (Mutual Exclusion) là cơ chế đồng bộ hóa cho phép chỉ một thread truy cập vào một tài nguyên cụ thể tại một thời điểm. Nó hoạt động bằng cách khóa tài nguyên khi một thread đang sử dụng và mở khóa khi thread đó hoàn thành.
  2. Câu hỏi: Semaphore là gì và sự khác biệt giữa mutex và semaphore?

    • Trả lời: Semaphore là cơ chế đồng bộ hóa cho phép nhiều thread truy cập vào một tài nguyên với một số lượng giới hạn. Sự khác biệt chính là mutex chỉ cho phép một thread truy cập, trong khi semaphore cho phép một số lượng thread giới hạn truy cập đồng thời.

Synchronized

  1. Câu hỏi: Từ khóa synchronized trong Java là gì và nó hoạt động như thế nào?

    • Trả lời: Từ khóa synchronized được sử dụng để đảm bảo rằng một phương thức hoặc khối mã chỉ được một thread thực thi tại một thời điểm. Nó hoạt động bằng cách khóa đối tượng hoặc lớp mà thread đang truy cập.
  2. Câu hỏi: Sự khác biệt giữa phương thức synchronized và khối synchronized là gì?

    • Trả lời: Phương thức synchronized khóa toàn bộ phương thức, trong khi khối synchronized chỉ khóa một phần của mã trong phương thức. Khối synchronized linh hoạt hơn vì nó có thể khóa đối tượng cụ thể và chỉ phần mã cần thiết.
  3. Câu hỏi: Hãy cho ví dụ về phương thức synchronized.

    • Trả lời:

        public class Counter {
            private int count = 0;
      
            public synchronized void increment() {
                count++;
            }
      
            public int getCount() {
                return count;
            }
        }
      
  4. Câu hỏi: Hãy cho ví dụ về khối synchronized.

    • Trả lời:

        public class Counter {
            private int count = 0;
      
            public void increment() {
                synchronized(this) {
                    count++;
                }
            }
      
            public int getCount() {
                return count;
            }
        }
      

Volatile

  1. Câu hỏi: Từ khóa volatile trong Java là gì và khi nào nên sử dụng nó?

    • Trả lời: Từ khóa volatile được sử dụng để báo hiệu rằng một biến có thể được một số thread thay đổi, đảm bảo rằng các thread khác sẽ thấy giá trị cập nhật nhất của biến này. Nó nên được sử dụng khi một biến được nhiều thread truy cập và thay đổi mà không cần đồng bộ hóa toàn bộ phương thức hoặc khối mã.
  2. Câu hỏi: Hãy cho ví dụ về việc sử dụng từ khóa volatile.

    • Trả lời:

        public class SharedData {
            private volatile boolean flag = true;
      
            public void stop() {
                flag = false;
            }
      
            public void doWork() {
                while (flag) {
                    // Thực hiện công việc
                }
            }
        }
      

Wait() and Notify()

  1. Câu hỏi: Phương thức wait()notify() trong Java là gì và chúng hoạt động như thế nào?

    • Trả lời: Phương thức wait() tạm dừng thread hiện tại và đưa nó vào trạng thái chờ cho đến khi một thread khác gọi notify() hoặc notifyAll() trên cùng một đối tượng khóa. notify() đánh thức một thread đang chờ, trong khi notifyAll() đánh thức tất cả các thread đang chờ trên đối tượng đó.
  2. Câu hỏi: Hãy cho ví dụ về việc sử dụng wait()notify().

    • Trả lời:

        public class WaitNotifyExample {
            private static final Object lock = new Object();
      
            public static void main(String[] args) {
                Thread t1 = new Thread(() -> {
                    synchronized (lock) {
                        try {
                            System.out.println("Thread 1 waiting");
                            lock.wait();
                            System.out.println("Thread 1 resumed");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });
      
                Thread t2 = new Thread(() -> {
                    synchronized (lock) {
                        System.out.println("Thread 2 notifying");
                        lock.notify();
                    }
                });
      
                t1.start();
                t2.start();
            }
        }
      

More on Threading

  1. Câu hỏi: Sự khác biệt giữa phương thức sleep()wait() là gì?

    • Trả lời: sleep() là phương thức của Thread class, tạm dừng thread hiện tại trong khoảng thời gian xác định mà không giải phóng khóa. wait() là phương thức của Object class, tạm dừng thread hiện tại cho đến khi nó được thông báo và giải phóng khóa.
  2. Câu hỏi: Executor framework trong Java là gì và tại sao nó quan trọng?

    • Trả lời: Executor framework cung cấp một cơ chế quản lý và thực thi các nhiệm vụ (tasks) bằng cách sử dụng pool của các thread, giúp đơn giản hóa quản lý thread và cải thiện hiệu suất.
  3. Câu hỏi: Hãy giải thích khái niệm thread pool và lợi ích của nó.

    • Trả lời: Thread pool là một nhóm các thread được quản lý để thực hiện các nhiệm vụ đồng thời. Lợi ích của thread pool bao gồm cải thiện hiệu suất bằng cách tái sử dụng các thread, giảm chi phí tạo thread mới, và kiểm soát số lượng thread hoạt động đồng thời.
  4. Câu hỏi: Hãy cho ví dụ về việc sử dụng ExecutorService để quản lý thread pool.

    • Trả lời:

        import java.util.concurrent.ExecutorService;
        import java.util.concurrent.Executors;
      
        public class ExecutorServiceExample {
            public static void main(String[] args) {
                ExecutorService executorService = Executors.newFixedThreadPool(3);
      
                for (int i = 0; i < 5; i++) {
                    executorService.execute(() -> {
                        System.out.println("Thread " + Thread.currentThread().getName() + " is running");
                    });
                }
      
                executorService.shutdown();
            }
        }
      

Những câu hỏi này sẽ giúp đánh giá kiến thức của ứng viên về các khía cạnh quan trọng của multi-threading trong Java.

More from this blog

hoangkim

366 posts