Màn hình trong Java là gì?


129

Một màn hình được đề cập đến trong lập trình đồng thời trong Java là gì?

Khi tôi đọc rằng "mọi đối tượng đều liên kết với màn hình" nghĩa là gì?

Nó có phải là một đối tượng đặc biệt?


11
+1 Điều này khiến tôi đọc cách các màn hình được triển khai ở mức JVM. Đã học được điều gì đó mới
naikus

@naikus Tôi mong chia sẻ thông tin chi tiết về bạn :)
roottraveller

Câu trả lời:


89

Một màn hình là cơ chế để kiểm soát truy cập đồng thời vào một đối tượng.

Điều này cho phép bạn làm:

Chủ đề 1:

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

Chủ đề 2:

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

Điều này ngăn Chủ đề 1 và 2 truy cập vào phần được theo dõi (đồng bộ hóa) cùng một lúc. Một cái sẽ bắt đầu và màn hình sẽ ngăn người kia truy cập vào khu vực trước khi cái đầu tiên kết thúc.

Nó không phải là một đối tượng đặc biệt. Đó là cơ chế đồng bộ hóa được đặt ở cấp bậc phân cấp lớp : java.lang.Object.

Ngoài ra còn có waitnotifycác phương thức cũng sẽ sử dụng màn hình của đối tượng để liên lạc giữa các luồng khác nhau.


1
vậy chúng ta có thể nói rằng khi chúng ta tạo một phương thức đồng bộ hóa, chúng ta đang xác định khóa (màn hình) trên phương thức của đối tượng đó không?
xdevel2000

28
Erm, không chính xác. Mỗi đối tượng tự động có một màn hình (mutex) được liên kết với nó, bất kể mọi thứ khác. Khi bạn khai báo một phương thức được đồng bộ hóa, bạn đang tuyên bố rằng thời gian chạy phải có được khóa trên màn hình của đối tượng trước khi bắt đầu thực hiện phương thức đó (và phải giải phóng khóa trước khi điều khiển quay lại mã gọi).
Andrzej Doyle

31
Và @Pablo - không có thứ gọi là màn hình cho một phương thức; các màn hình chỉ tồn tại cho các đối tượng, là đối tượng kèm theo cho hầu hết các phương thức hoặc Classđối tượng tương ứng cho các phương thức tĩnh. Nếu bạn đã có phương thức được đồng bộ hóa 1 () và bạn khai báo phương thức 2 () được đồng bộ hóa, không có màn hình mới nào được tạo và trên thực tế, việc gọi một trong hai phương thức (trên cùng một đối tượng) sẽ cố gắng khóa cùng một màn hình. Điều này thường bắt những người mới.
Andrzej Doyle

1
@Andrzej: vì vậy, mọi đối tượng đều có MỘT màn hình được liên kết với nó. Sau đó tôi có thể có nhiều phương thức đồng bộ. Sau bất cứ khi nào phương thức đó, một luồng gọi nó sẽ có được màn hình đó thực hiện công cụ đồng bộ hóa.
xdevel2000

1
chỉ cần làm rõ điều này ... đối tượng được sử dụng để gọi một khối được đồng bộ hóa trong luồng 1 có thể được sử dụng lại trong luồng khác (luồng 2) để gọi phương thức bình thường (không được đồng bộ hóa) cùng một lúc không?

26

Một màn hình là một thực thể sở hữu cả khóa và bộ chờ . Trong Java, bất kỳ Objectcó thể phục vụ như một màn hình.

Để được giải thích chi tiết về cách các màn hình hoạt động trong Java, tôi khuyên bạn nên đọc phần Cơ chế giám sát của Lập trình đồng thời trong Java (liên kết trước hiển thị bản xem trước trong sách của Google và phần đó có sẵn để đọc).


Như bạn đã nói "Màn hình là một thực thể ..", điều đó có nghĩa là màn hình là một đối tượng / trạng thái bên trong sở hữu / theo dõi khóa và waitset? Nếu không bạn có thể vui lòng xây dựng thực thể ở đây? Về cơ bản khi tài liệu java của chúng tôi nói Wakes up all threads that are waiting on this object's monitor. về notifyall (), những gì tôi nhận được là đối tượng đang duy trì (với sự trợ giúp của thực thể / đối tượng bên trong) tất cả các luồng đang chờ khóa, thực thể / đối tượng bên trong đó được gọi là màn hình?
dùng3198603

Câu trả lời hữu ích nhất. Cảm ơn @JRL.
gravetii

Đối với tôi nó nói: "Không có bản xem trước có sẵn cho trang này."
opncow

9
  1. Một màn hình là một khái niệm / cơ chế không giới hạn đối với Ngôn ngữ Java;
  2. "Trong lập trình đồng thời, màn hình là một đối tượng hoặc mô-đun dự định được sử dụng an toàn bởi nhiều hơn một luồng";
  3. Như mọi người đọc đều biết, mọi đối tượng trong Java là một lớp con của java.lang.Object. Các java đã tạo java.lang.Object theo cách nó có các tính năng và đặc điểm cho phép các lập trình viên Java sử dụng bất kỳ đối tượng nào làm màn hình. Ví dụ, mọi đối tượng đều có hàng đợi, hàng đợi vào lại và chờ và thông báo cho các phương thức biến nó thành màn hình;
  4. đọc về màn hình ở đây .

4

Ngôn ngữ Java và hệ thống thời gian chạy hỗ trợ đồng bộ hóa luồng thông qua việc sử dụng màn hình.
Một màn hình được liên kết với một mục dữ liệu cụ thể (một biến điều kiện) và hoạt động như một khóa trên dữ liệu đó. Khi một luồng giữ màn hình cho một số mục dữ liệu, các luồng khác sẽ bị khóa và không thể kiểm tra hoặc sửa đổi dữ liệu.



2

Màn hình là một cấu trúc đồng bộ hóa cho phép các luồng có cả loại trừ lẫn nhau và khả năng chờ (chặn) để một điều kiện nhất định trở thành đúng.

Màn hình cũng có một cơ chế để báo hiệu các luồng khác rằng tình trạng của chúng đã được đáp ứng. Nó là một thực thể sở hữu cả khóa và bộ chờ. Trong Java, bất kỳ Đối tượng nào cũng có thể đóng vai trò là màn hình.

Trong máy ảo Java, mọi đối tượng và lớp được liên kết logic với một màn hình. Để thực hiện khả năng loại trừ lẫn nhau của màn hình, một khóa (đôi khi được gọi là mutex) được liên kết với từng đối tượng và lớp. Đây được gọi là semaphore trong các thuật ngữ hệ điều hành, mutex là một semaphore nhị phân.

Để biết thêm thông tin kiểm tra liên kết


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.