Tôi hiểu rằng các bộ sưu tập như Hashtable được đồng bộ hóa, nhưng ai đó có thể giải thích cho tôi cách hoạt động của và tại thời điểm nào quyền truy cập bị hạn chế đối với các cuộc gọi đồng thời? Ví dụ: giả sử tôi sử dụng một số trình lặp như sau:Giải thích đồng bộ hóa các bộ sưu tập khi các trình vòng lặp được sử dụng?
Hashtable<Integer,Integer> map = new Hashtable<Integer,Integer>();
void dosomething1(){
for (Iterator<Map.Entry<Integer,Integer>> i = map.entrySet().iterator(); i.hasNext();){
// do something
}
}
void dosomething2(){
for (Iterator<Map.Entry<Integer,Integer>> i = map.entrySet().iterator(); i.hasNext();){
// do something
// and remove it
i.remove();
}
}
void putsomething(int a, int b){
map.put(a,b);
}
void removesomething(int a){
map.remove(a);
}
var clear(){
map = new Hashtable<Integer,Integer>();
}
Ai đó có thể giải thích nếu có bất kỳ cạm bẫy nào khi tôi gọi các chức năng này ngẫu nhiên với các chủ đề khác nhau không? Làm thế nào để các iterator, đặc biệt, làm đồng bộ hóa của nó, đặc biệt là khi nó được sử dụng entrySet(), mà dường như cũng yêu cầu đồng bộ hóa? Điều gì sẽ xảy ra nếu clear() được gọi trong khi một trong các vòng lặp đang diễn ra? Điều gì sẽ xảy ra nếu removeomething() loại bỏ một mục chưa được xử lý bởi một vòng lặp đồng thời trong dosomething1()?
Cảm ơn bạn đã trợ giúp!
Cố định câu trả lời: màn hình được sử dụng thực sự là bộ sưu tập bao bọc, chứ không phải bộ sưu tập gốc. – Dirk
Đó là siêu hữu ích và trình bày rất tốt. Tôi đã gặp khó khăn khi tìm một nguồn giải thích rõ ràng điều này, vì vậy cảm ơn rất nhiều! – DivideByHero
"Lặp lại bộ sưu tập trong Java không phải là chủ đề an toàn, ngay cả khi bạn đang sử dụng một trong các trình bao bọc được đồng bộ" O_o khủng khiếp – rkarajan