Java: Liveness

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Khả năng của một ứng dụng đồng thời là thực hiện một cách kịp thời và được biết đến với khái niệm liveness. Bài viết này sẽ mô tả vấn đề phổ biến nhất của liveness là deadlock, và bài viết cũng mô tả ngắn gọn hai vấn đề liveness khác là starvation và livelock.

Deadlock

Deadlock mô tả một tình huống trong đó hai hay nhiều luồng bị khóa vĩnh viễn đang chờ đợi nhau. Dưới đây là một ví dụ.

Alphonse và Gaston là bạn bè, và họ rất tôn trọng phép lịch sự. Một nguyên tắc nghiêm ngặt của phép lịch sự là khi bạn cúi chào một người bạn, bạn phải tiếp tục cúi đầu cho đến khi bạn của bạn có cơ hội cúi đầu chào lại. Thật không may, nguyên tắc này không tính đến khả năng rằng hai người bạn có thể cũng cúi chào nhau ở cùng một thời điểm. Ứng dụng từ ví dụ này, ta có ví dụ về lớp Deadlock dưới đây:

public class Deadlock {
    static class Friend {
        private final String name;
        public Friend(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
        public synchronized void bow(Friend bower) {
            System.out.format("%s: %s"
                + "  has bowed to me!%n", 
                this.name, bower.getName());
            bower.bowBack(this);
        }
        public synchronized void bowBack(Friend bower) {
            System.out.format("%s: %s"
                + " has bowed back to me!%n",
                this.name, bower.getName());
        }
    }

    public static void main(String[] args) {
        final Friend alphonse =
            new Friend("Alphonse");
        final Friend gaston =
            new Friend("Gaston");
        new Thread(new Runnable() {
            public void run() { alphonse.bow(gaston); }
        }).start();
        new Thread(new Runnable() {
            public void run() { gaston.bow(alphonse); }
        }).start();
    }
}

Khi thực thi lớp Deadlock, rất có thể là cả hai luồng sẽ chăn nhau khi chúng cố gắng gọi phương thức bowBack(). Việc đóng này sẽ không bao giờ kết thúc, bởi vì các luồng có sự chờ đợi nhau để thoát khỏi phương thức bow().

Starvation và livelock

Starvation và livelock ít phổ biến hơn so với deadlock, nhưng vẫn còn những vấn đề mà mỗi nhà thiết kế phần mềm đồng thời có khả năng gặp phải.

Starvation

Starvation mô tả một tình huống mà một luồng không thể được truy cập thường xuyên để chia sẻ tài nguyên và không thể tạo tiến trình. Điều này xảy ra khi tài nguyên chia sẻ được thực hiện không có sẵn trong thời gian dài mà lỗi là do các luồng "tham lam". Ví dụ, giả sử một đối tượng cung cấp một phương thức đồng bộ hóa thường phải mất một thời gian dài để trả về. Nếu một luồng gọi phương thức này thường xuyên, các luồng khác cũng cần thường xuyên truy cập đồng bộ hóa tới cùng một đối tượng thì sẽ thường xuyên bị chặn.

Livelock

Một luồng thường xuyên hoạt động để đáp ứng với những hành động của luồng khác. Nếu hành động luồng khác cũng là một sự đáp ứng với hành động của một luồng khác nữa, thì livelock có thể xảy ra. Cũng như deadlock, các luồng đã livelock không thể tạo được tiến trình. Tuy nhiên, những không bị chặn - chúng chỉ đơn giản là 'quá bận' để đáp ứng nhau để tiếp tục công việc. Điều này có thể so sánh với hai người đang cố gắng vượt qua nhau trong một hành lang: Alphonse di chuyển sang bên trái của mình để cho Gaston vượt qua, trong khi Gaston di chuyển sang bên phải để cho Alphonse vượt qua. Như vậy thì họ họ vẫn đang chặn nhau, bởi vì Alphone di chuyển sang bên phải, trong khi Gaston di chuyển sang bên trái của mình.

» Tiếp: Khối bảo vệ
« Trước: Truy cập atomic
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!