Tôi có một số câu hỏi về sự khẳng định của Java.Vấn đề về chuyển nhượng Java - Đây có phải là nguyên tử không?
- Strings
Tôi đã có một lớp:
public class Test {
private String s;
public synchronized void setS(String str){
s = s + " - " + str;
}
public String getS(){
return s;
}
}
Tôi đang sử dụng "đồng bộ" trong setter của tôi, và tránh nó trong getter của tôi, bởi vì trong ứng dụng của tôi, có rất nhiều dữ liệu và rất ít cài đặt. Cài đặt phải được đồng bộ hóa để tránh sự không thống nhất. Câu hỏi của tôi là: đang nhận và thiết lập một biến nguyên tử? Tôi có nghĩa là, trong một môi trường đa luồng, Thread1 sắp đặt biến s, trong khi Thread2 sắp sửa lấy "s". Có cách nào getter phương pháp có thể nhận được một cái gì đó khác với giá trị cũ của s hoặc giá trị mới của s (giả sử chúng tôi đã có chỉ có hai chủ đề)? Trong ứng dụng của tôi nó không phải là một vấn đề để có được giá trị mới, và nó không phải là một vấn đề để có được một tuổi. Nhưng tôi có thể lấy thứ gì khác không?
- Điều gì về việc nhận và đưa HashMap?
coi đây:
public class Test {
private Map<Integer, String> map = Collections.synchronizedMap(new HashMap<Integer, String>());
public synchronized void setMapElement(Integer key, String value){
map.put(key, value);
}
public String getValue(Integer key){
return map.get(key);
}
}
là đưa và nhận nguyên tử? HashMap xử lý việc đưa một phần tử vào trong đó như thế nào? Trước tiên nó có xóa giá trị cũ và đặt giá trị hiện tại không? Tôi có thể nhận được khác hơn giá trị cũ hoặc giá trị mới?
Cảm ơn trước!
+1 để chỉ định rằng người đọc không cần thấy giá trị mới nhất tuyệt đối. Tất nhiên, điều đó chắc chắn nên được ghi lại trong mã sản xuất. –