Ý nghĩa của màn hình đối tượng trong Java là gì? Tại sao sử dụng từ này?


86

Khi đọc các bài viết về các luồng Java, tôi thường nhận thấy biểu thức: "luồng hiện tại là chủ sở hữu của màn hình đối tượng này". Tôi hiểu được ý nghĩa: luồng có quyền hoạt động trên đối tượng. Nhưng tôi không hiểu tại sao chúng ta sử dụng cụm từ "màn hình của đối tượng" thay vì "khóa của đối tượng"?

Tóm lại, tôi không biết nghĩa của từ 'màn hình' Câu hỏi có thể lạ và đơn giản. Nhưng tôi muốn ai đó có thể giúp giải quyết nó. 3ks


1
+1 @ulmangt vì là người duy nhất thực sự trả lời câu hỏi của bạn: Chúng tôi gọi chúng là "màn hình" vì đó là những gì Hoare gọi chúng trở lại vào năm 1974.
Solomon Slow

Câu trả lời:


51

nhưng tôi đang khó hiểu tại sao lại sử dụng từ "the object's monitor" và "the object's lock"?

Xem câu trả lời của ulmangt để biết các liên kết giải thích thuật ngữ "màn hình" được sử dụng trong ngữ cảnh này. Lưu ý rằng:

"Màn hình được phát minh bởi Per Brinch Hansen và CAR Hoare, và lần đầu tiên được triển khai bằng ngôn ngữ Pascal đồng thời của Brinch Hansen."

(Nguồn: Wikipedia )

Tại sao sử dụng thuật ngữ "màn hình" thay vì "khóa"? Nói một cách chính xác, các thuật ngữ có nghĩa là những điều khác nhau ... đặc biệt nếu bạn sử dụng chúng theo cách mà chúng được dự định sử dụng ban đầu.

  • Một "khóa" là một cái gì đó với các nguyên thủy thu được và giải phóng để duy trì các thuộc tính khóa nhất định; ví dụ sử dụng độc quyền hoặc một người viết / nhiều người đọc.

  • "Màn hình" là một cơ chế đảm bảo rằng chỉ một luồng có thể thực thi một phần (hoặc các phần) mã nhất định tại bất kỳ thời điểm nào. Điều này có thể được thực hiện bằng cách sử dụng khóa (và "biến điều kiện" cho phép các luồng chờ hoặc gửi thông báo đến các luồng khác rằng điều kiện được đáp ứng), nhưng nó không chỉ là một khóa. Thật vậy, trong trường hợp Java, khóa thực sự được sử dụng bởi màn hình không thể truy cập trực tiếp. (Bạn chỉ không thể nói "Object.lock ()" để ngăn các luồng khác lấy nó ... giống như bạn có thể làm với một phiên bản Java Lock.)

Nói tóm lại, nếu được coi là "màn hình" thực sự là một thuật ngữ tốt hơn "khóa" để mô tả những gì Java đang cung cấp. Nhưng trên thực tế, cả hai thuật ngữ này hầu như được sử dụng thay thế cho nhau.



9

Trích dẫn từ Bên trong Máy ảo Java

Một luồng trong máy ảo Java yêu cầu khóa khi nó đến đầu vùng giám sát. Trong Java, có hai loại vùng giám sát: các câu lệnh được đồng bộ hóa và các phương thức đồng bộ hóa.

Giám sát

Màn hình giống như một tòa nhà có chứa một căn phòng đặc biệt mà chỉ một luồng có thể bị chiếm đóng tại một thời điểm. Phòng thường chứa một số dữ liệu. Từ khi một luồng vào phòng này cho đến khi nó rời đi, nó có quyền truy cập độc quyền vào bất kỳ dữ liệu nào trong phòng. Bước vào tòa nhà màn hình được gọi là "vào màn hình." Bước vào căn phòng đặc biệt bên trong tòa nhà được gọi là "mua màn hình." Chiếm phòng được gọi là "sở hữu màn hình" và rời khỏi phòng được gọi là "giải phóng màn hình". Rời khỏi toàn bộ tòa nhà được gọi là "thoát khỏi màn hình."

Ngoài việc được liên kết với một bit dữ liệu, một màn hình được kết hợp với một hoặc nhiều bit mã, mà trong sách này sẽ được gọi là vùng màn hình.

Như đã đề cập trước đó, ngôn ngữ này cung cấp hai cách tích hợp để xác định vùng màn hình trong chương trình của bạn: câu lệnh đồng bộ hóa và phương thức đồng bộ hóa. Hai cơ chế này, thực hiện khía cạnh loại trừ lẫn nhau của đồng bộ hóa, được hỗ trợ bởi tập lệnh của máy ảo Java.

Khóa

Để thực hiện khả năng loại trừ lẫn nhau của các màn hình, máy ảo Java liên kết một khóa (đôi khi được gọi là mutex) với từng đối tượng và lớp. Khóa giống như một đặc quyền mà chỉ một chủ đề có thể "sở hữu" tại bất kỳ thời điểm nào.

Một luồng duy nhất được phép khóa cùng một đối tượng nhiều lần. Đối với mỗi đối tượng, máy ảo Java duy trì số lần đối tượng đã bị khóa. Một đối tượng được mở khóa có số đếm bằng không. Khi một luồng có được khóa lần đầu tiên, số lượng lại được tăng lên một. Mỗi khi luồng có được một khóa trên cùng một đối tượng, số lượng lại được tăng lên.


6

Một synchronizedkhối xung quanh một objectlà màn hình của nó, điều khiển khóa trên đối tượng. Đây là một ví dụ

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}

4

Mặc dù đã muộn để trả lời câu hỏi này, tôi nghĩ chỉ cần thêm vào trường hợp nó hữu ích.
Đây là một khối mã Java được đồng bộ hóa bên trong một phương thức Java không đồng bộ hóa

public void add(int value){
synchronized(this){
      this.count += value;
   }
}

Trong ví dụ, "this" được sử dụng, là trường hợp mà phương thức add được gọi. Một phương thức cá thể được đồng bộ hóa sử dụng đối tượng mà nó thuộc về làm đối tượng giám sát.
=> Chỉ một luồng có thể thực thi bên trong một khối mã Java được đồng bộ hóa trên cùng một đối tượng giám sát.


3

Máy ảo Java sử dụng màn hình để hỗ trợ đa luồng. Màn hình đạt được điều này thông qua hai khái niệm - Loại trừ lẫn nhau trong khi chạy các luồng (ở đây là nơi 'khóa' xuất hiện) và phối hợp như một phương tiện giao tiếp giữa các luồng (đây là nơi các phương thức chờ và thông báo của đối tượng đi vào hình ảnh).

Đọc phần sau từ "Inside JVM" sẽ xóa nghi ngờ này, nó có được giải thích rất hay ở đây không (Chương 20, Đồng bộ hóa luồng) -

https://www.artima.com/insidejvm/ed2/threadsynchP.html

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.