2010-01-27 35 views

Trả lời

4

Vector được coi là 'an toàn chỉ' vì việc truy cập các phần tử bên trong của Vector được đồng bộ hóa. Các phương thức như add(), get(), size(), v.v ... đều được đồng bộ hóa để sửa đổi cấu trúc bên trong của Vector và truy cập vào cấu trúc bên trong đó không thể xử lý đồng thời bằng các luồng riêng biệt.

16

Nó được tạo thành "an toàn chỉ" bởi tất cả các phương pháp được đồng bộ hóa (thông qua từ khóa được đồng bộ hóa), xem OpenJDK source code.

Từ khóa được đồng bộ hóa làm gì để ngăn chặn nhiều hơn một chuỗi thực thi bất kỳ phương thức đồng bộ nào cùng một lúc. Nó đang sử dụng một khóa trong nội bộ, mà một thread phải có được khi nhập vào của những phương thức đó, và rằng các thread phát hành khi nó rời khỏi phương thức. Lưu ý rằng điều này không thực sự giúp ích nhiều, bởi vì trong khi nó ngăn cản trạng thái nội tại không nhất quán của vec-tơ, điều này không đảm bảo mức độ nhất quán ở mức cao hơn (mức hữu ích cho một ứng dụng).

Hãy xem xét ví dụ này cho thấy rằng bạn vẫn cần phải sử dụng đồng bộ hóa trong mã ứng dụng của bạn (vì vậy mà bạn có thể chỉ cần cũng đã sử dụng ArrayList không đồng bộ):

// BROKEN CODE, needs external synchronization 
// only add an element if the vector is empty 
if(vector.isEmpty()) 
    vector.add(anElement); 
+0

+1 nhưng bạn nên sửa "Từ khóa được đồng bộ hóa làm gì để ngăn chặn nhiều hơn một chuỗi thực thi phương thức cùng một lúc". Nó không chỉ truy cập vào phương thức cụ thể bị chặn. – Fredrik

+0

@Fredrik: Cảm ơn. Tôi đã cố sửa câu mà không bị quá phức tạp. Tôi cho rằng một liên kết đến một lời giải thích dài hơn sẽ theo thứ tự. – Thilo

+0

Tôi có đúng không, trong đoạn mã mà bạn cung cấp, 'vector' có thể đã bị thay đổi (trở thành không trống) trước' vector.add (anElement); '? – soshial

0

Hãy tìm ra những đoạn trích dưới đây từ java api

Trước tiên, không thể cho hai lần gọi các phương thức đồng bộ trên cùng một đối tượng để xen kẽ. Khi một luồng đang thực hiện một phương thức đồng bộ cho một đối tượng, tất cả các luồng khác gọi ra các phương thức đồng bộ cho cùng một khối đối tượng (tạm dừng thực hiện) cho đến khi luồng đầu tiên được thực hiện với đối tượng.

Thứ hai, khi một phương thức đồng bộ thoát, nó sẽ tự động thiết lập mối quan hệ xảy ra trước đó với bất kỳ lời gọi tiếp theo nào của phương thức được đồng bộ hóa cho cùng một đối tượng. Điều này đảm bảo rằng các thay đổi đối với trạng thái của đối tượng được hiển thị cho tất cả các luồng.

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