2009-03-04 19 views
5

Bây giờ, tôi không chắc đây có phải là một câu hỏi ngu ngốc hay không, xin vui lòng chịu với tôi nếu có.Java: Cái gì, nếu có, bị khóa bởi các phương thức được đồng bộ ngoài đối tượng chúng thuộc về?

Khóa trên vật thể "đệ quy", i. e. nếu hai đối tượng có tham chiếu đến một đối tượng thứ ba trong các trường của họ và một luồng đang chạy một phương thức được đồng bộ hóa trên một trong hai đối tượng, thì có thể bất kỳ luồng nào khác truy cập đối tượng thứ ba không?

// a and b are some objects that implement Runnable 
// they both reference the same third object 
a.ref = c; 
b.ref = c; 

// a is run in a thread and processes some data in a loop for a long time 
// the method the loop belongs to is declared synchronized 
threadA = new Thread(a); 
threadA.start(); 

a.someSyncedMethod(); // this would block ... 
b.ref.someOtherSyncedMethod(); // ... but would this? 
a.ref.someOtherSyncedMethod(); // ... and how about this? 
+0

Đó không phải là một câu hỏi ngu ngốc chút nào - chỉ là câu hỏi cơ bản. Không có hại khi yêu cầu hiểu rõ hơn về các nguyên tắc cơ bản về ngôn ngữ –

+0

Cảm ơn bạn. Tôi cảm thấy điều này bằng cách nào đó nên rõ ràng, nhưng tôi vẫn không hiểu. –

Trả lời

10

Có giá trị tách các khái niệm "khóa" và "khóa đối tượng". Không có ý tưởng thực sự về "khóa một đối tượng" - có "mua lại (và phát hành)" khóa được kết hợp với một đối tượng. Vâng, có vẻ như tôi đang đánh bạc - nhưng sự khác biệt là quan trọng bởi vì nếu bạn nói về một đối tượng bị khóa, có vẻ như không có chủ đề nào khác có thể thay đổi bất kỳ thứ gì trong đối tượng trong khi khóa đó được giữ.

Thay vào đó, điều đó chỉ có nghĩa là không có chủ đề nào khác có thể nhận được cùng một khóa trong khi khóa được giữ. Không có mối quan hệ trực tiếp giữa khóa và bất kỳ nội dung nào của đối tượng mà khóa được liên kết.

Phương pháp được khai báo là "đồng bộ hóa" có được khóa được liên kết với cá thể của đối tượng mà chúng thuộc về. Điều này chỉ làm cho các phương thức đồng bộ khác trên cùng một đối tượng chờ đợi và các câu lệnh được đồng bộ hóa đồng bộ hóa rõ ràng với nó.

Cá nhân tôi không thích các phương thức được đồng bộ hóa - Tôi muốn làm cho nó rõ ràng hơn bằng cách đồng bộ hóa rõ ràng trên biến thành viên (riêng tư, cuối cùng) chỉ được sử dụng để đồng bộ hóa.

+0

Vâng, nó giúp, nhưng tôi không chắc chắn nếu tôi đã thực sự có nó. Có đúng là chỉ những cuộc gọi đó sẽ chặn mà cần cùng một khóa, i. e. các cuộc gọi đến các phương thức đồng bộ của cùng một cá thể, trong khi bất kỳ mã nào khóa trên một thành viên của một sẽ tiến hành? –

+0

Có. Cá nhân tôi không thích các phương thức đồng bộ hóa - tôi muốn làm cho nó rõ ràng hơn bằng cách đồng bộ hóa rõ ràng trên một biến thành viên (riêng tư, cuối cùng) chỉ được sử dụng để đồng bộ hóa. –

+0

Tôi đã chỉnh sửa phần trên vào bài đăng của bạn, tôi hy vọng, tôi đã làm đúng. Cảm ơn! –

1
a.someSyncedMethod(); // this would block ... 

Chỉ khi bạn đánh dấu một trong hai phương pháp chạy với đồng bộ hoặc có ThreadA mã chạy trong các phương pháp đồng bộ.

Trong JVM, mỗi đối tượng sở hữu cái được gọi là màn hình. Chỉ một luồng có thể sở hữu màn hình được kết hợp với một đối tượng nhất định tại một thời điểm. Đồng bộ hóa là phương tiện mà bạn cho biết chuỗi hiện tại sẽ đi lấy màn hình trước khi tiếp tục.

Cũng chính lớp đó sở hữu một màn hình cho các phương pháp tĩnh.

0

Ý nghĩa của "khóa" (thực tế biến thể này được gọi là màn hình) hoàn toàn là một quy ước, không có giới hạn truy cập nào được thực thi.

Chức năng phụ thuộc vào tất cả các đối tượng đang hoạt động tốt và có được khóa tương ứng trước khi truy cập dữ liệu. Chỉ bằng cách đóng gói hành vi mong muốn này trong một lớp với các điều khiển truy cập thích hợp, bạn có thể thực thi nó cho các đối tượng máy khách.

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