2012-01-01 35 views
7

Tôi rất bối rối về hai giới thiệu sau đây:Làm thế nào để hiểu được phương thức chờ và thông báo trong Java Thread?

  1. "Các khối phương pháp chờ đợi thread gọi và từ bỏ khóa màn hình"
  2. "Phương pháp thông báo cho unblocks một chờ đợi chủ đề nhưng không từ bỏ giám sát khóa "

đây là câu hỏi của tôi:

  1. tôi biết từng đối tượng trong Java có một khóa, nhưng là những gì" Moni tor lock "nghĩa là gì? nó giống như khóa của oject?

  2. Tại sao phương thức thông báo cần phải từ bỏ khóa màn hình?

  3. Nếu tôi cố gắng để làm cho một đối tượng chờ đợi với đoạn mã sau:

    class simpleTask extends Thread 
    { 
        int waitingTime; 
    
        public simpleTask(int waitingTime) 
        { 
         this.waitingTime = waitingTime; 
        } 
    
        public void run() 
        { 
         synchronized(this) // this is a reference of current object 
         { 
         try { 
          this.wait(waitingTime); 
         } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
    } 
    

Giống như mô tả đầu tiên ở trên, được có nghĩa là đối tượng hiện bị chặn bởi từ khóa đồng bộ, và sau đó chờ phương pháp giải phóng khóa?

Trả lời

7

Tôi biết từng đối tượng trong Java có khóa, nhưng "khóa màn hình" nghĩa là gì? nó giống như khóa của đối tượng?

Vâng, chúng giống nhau. Chúng cũng đôi khi được gọi là "mutex" của đối tượng và "khóa nguyên thủy" của đối tượng. (Nhưng khi ai đó nói về Lock, họ đang nói về this Java interface ... mà là một cơ chế khác nhau khóa.)

Tại sao thông báo phương pháp cần phải bỏ khóa màn hình?

Phương thức notifykhông bỏ khóa. Trách nhiệm của bạn là từ bỏ khóa (tức làđể lại khối đồng bộ hoặc trả về từ phương thức đã đồng bộ hóa) sau khi trả về cuộc gọi notify.

Tại sao điều đó lại cần thiết? Vì bất kỳ chủ đề nào khác hiện đang chờ trên khóa đó (trong một cuộc gọi wait(...)) phải phản hồi lại khóa đó trước khi cuộc gọi wait có thể hoàn tất.

Tại sao họ thiết kế notify/wait như thế này? Vì vậy, chúng có thể được sử dụng để thực hiện các biến điều kiện.

Giống như mô tả đầu tiên ở trên, điều đó có nghĩa là đối tượng hiện tại bị chặn bởi từ khóa được đồng bộ hóa, và sau đó phương thức chờ giải phóng khóa?

Điều đó là chính xác. Khi một chuỗi gọi someObject.wait() khóa của nó trên someObject được giải phóng ... và sau đó được phản hồi (bởi cùng một luồng) trước khi trả lại cuộc gọi wait(). Tất nhiên, trong khi chờ đợi, khóa someObjectcó thể đã được mua lại và phát hành nhiều lần bởi các chủ đề khác. Vấn đề là khi wait trả về, luồng được gọi là wait sẽ có khóa.

+0

Cảm ơn câu trả lời của bạn! Nhưng trong giải thích của bạn: "Khi bạn gọi someObject.wait() khóa của thread trên someObject được phát hành ... và sau đó được trả lời trước khi cuộc gọi wait() trả về", ai sẽ trả lời khóa trước khi cuộc gọi wait() trả về? Cảm ơn một lần nữa! –

+0

@Miles Zhang: Cùng một luồng sẽ phản hồi lại, miễn là nó có sẵn (nghĩa là một số luồng khác chưa có được nó). – Tudor

+0

@MilesZhang - đã cập nhật câu trả lời để làm rõ. –

0
  1. Có, khóa màn hình cũng giống như khóa của đối tượng. Nếu bạn làm synchronized (object), đó là khóa.

  2. Trong ví dụ của bạn, đối tượng hiện tại sẽ từ bỏ khóa trong khi đợi, cuộc gọi wait() sẽ tắt khóa. Trong một chủ đề khác, notify() được gọi để đánh thức vật thể lên và khi cuộc gọi wait() trả về, nó sẽ giữ lại khóa.

+0

Cảm ơn câu trả lời của bạn! –

0

A monitor is a type of synchronization construct.

Lý do mà chờ đợi từ bỏ khóa là để đề khác có thể có được khóa, chẳng hạn như chủ đề khác có thể muốn đợi. Ngoài ra: Đó là bình thường cho các chủ đề đó là đánh thức các chủ đề khác để khóa trước khi phát hành bất kỳ chủ đề, để ngăn chặn một điều kiện chủng tộc.

Để biết thêm về điều này, bạn nên nghiên cứu các biến điều kiện (ví dụ: condvars).

+0

Cảm ơn! Tôi sẽ nhận được một số kiến ​​thức về biến điều kiện. –

Các vấn đề liên quan