2013-03-10 35 views
7

Tôi có câu hỏi liên quan đến các rào cản bộ nhớ khi sử dụng Condition được cung cấp bởi Lock.Rào cản bộ nhớ và ví dụ java.util.concurrent.locks.Condition

Về ví dụ được cung cấp trong the javadoc for Condition, tôi có một câu hỏi về việc sử dụng:

int putptr, takeptr, count; 

nên không những thuộc tính được khai báo biến động? Như tôi đã hiểu từ ví dụ này, một chuỗi có thể không thấy các sửa đổi, ví dụ: count.

Hoặc là, khi signal() được gọi, tất cả các sửa đổi được thực hiện kể từ khi khóa được mua lại được hiển thị cho các chủ đề khác? Giống như một số mã trong khối synchronized?

Nếu có, các sửa đổi có thể hiển thị khi gọi signal() hoặc khi số unlock() được gọi trên khóa không?

Cảm ơn.

Edit: Tôi nhìn thấy trong javadoc của Lock:

Tất cả Khóa triển khai phải thực thi cùng một ngữ nghĩa đồng bộ hóa bộ nhớ theo quy định của được xây dựng trong khóa màn hình, như mô tả trong phần 17.4 Java ™ Ngôn ngữ Đặc điểm kỹ thuật:

  • Thao tác khóa thành công có tác dụng đồng bộ hóa bộ nhớ giống như thao tác Khóa thành công.
  • Thao tác mở khóa thành công có cùng hiệu ứng đồng bộ hóa bộ nhớ dưới dạng tác vụ Mở khóa thành công.

Thao tác khóa và mở khóa không thành công và thao tác khóa/mở khóa reentrant, không yêu cầu bất kỳ hiệu ứng đồng bộ hóa bộ nhớ nào.

Họ có nghĩa là: "Một hoạt động khóa thành công có những tác động đồng bộ hóa bộ nhớ giống như bước vào một khối synchronized", và "Một hoạt động mở khóa thành công có những tác động đồng bộ hóa bộ nhớ giống như thoát khỏi một khối synchronized"?

+0

hiệu ứng giống với 'đồng bộ' và' Object.wait(), Object.notify() ' – irreputable

+0

' await() 'không mở khóa khi nhập và khóa khi thoát. – irreputable

Trả lời

7

Cách bạn nên đọc vào đó là tất cả các ghi xảy ra trước lock.unlock được hiển thị cho tất cả lock.lock sau đó. Một chuỗi là await ing, khi được đánh thức, về cơ bản sẽ làm lock.lock. Vì vậy, tất cả các ghi đã xảy ra kể từ khi mở khóa trước đó bây giờ sẽ được hiển thị.

signal không có ngữ nghĩa về bộ nhớ, vì trạng thái sau của bạn là or when unlock() is called on the lock là chính xác.

Họ có nghĩa là: "Một hoạt động khóa thành công có cùng bộ nhớ hiệu ứng đồng bộ như nhập một khối đồng bộ", và "Một thành công hoạt động mở khóa có đồng bộ hóa bộ nhớ cùng hiệu ứng như thoát khỏi một khối đồng bộ"?

Vâng, chính xác! Cụ thể hơn, trình biên dịch sẽ phát hành các hướng dẫn mã byte của trình theo dõi và monitorexit.

+1

Ok, cảm ơn. Bạn cũng có thể kiểm tra chỉnh sửa của tôi không? – FBB

+0

Cảm ơn câu trả lời đầy đủ. – FBB

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