Bạn đang cố gắng làm gì? Các từ khóa synchronized
và volatile
là các cơ chế trong Java có thể được sử dụng để đảm bảo rằng các giá trị nhất quán được quan sát bởi các luồng khác nhau đọc cùng một dữ liệu. Cụ thể là chúng cho phép bạn giải thích về mối quan hệ xảy ra trước quan hệ trong chương trình của bạn.
Bạn chỉ đơn giản là không thể tránh sử dụng một trong số volatile
hoặc synchronized
để truy cập đúng các trường không phải final
trong chương trình nhiều luồng. Điều đó nói rằng, lý do chính khiến bạn có thể yêu cầu synchronized
hơn volatile
là yêu cầu sử dụng nguyên tử so sánh và đặt hoạt động (tức là nó sẽ không được xem xét hiệu suất). Ví dụ, trong một đa luồng chương trình:
volatile int i = 0;
public void foo() {
if (i == 0) i = i + 1;
}
Đoạn mã trên vốn đã không an toàn, mặc dù tuyên bố của biến như là phương tiện dễ bay hơi mà đọc và viết được đỏ mặt vào bộ nhớ chính - việc thực hiện an toàn duy nhất của như một phương pháp sẽ là một cái gì đó như:
int i = 0;
public synchronized void foo() {
if (i == 0) i = i + 1;
}
Vậy bạn nên chọn cái nào? Vâng, nếu bạn có nhiều chủ đề sửa đổi một trường phụ thuộc vào giá trị của trường đó (tức là so sánh và đặt), thì synchronized
là giải pháp an toàn duy nhất.
Cũng đáng nói: chi phí hoạt động của synchronized
không phải là vấn đề (trong phần lớn các trường hợp). Các vấn đề về hiệu năng đồng bộ hóa thường là do tắc nghẽn mã không cần thiết, các khóa chết hoặc các khóa sinh động và có thể được giảm nhẹ nếu cần thiết. Bất kỳ tinh khiết đồng hồ chu kỳ overhead sẽ lấn át bởi những thứ khác bạn ứng dụng nào: file IO, truy vấn cơ sở dữ liệu, truy cập từ xa, vv
Nguồn
2009-11-22 17:05:14
Tại sao bạn "không muốn khóa [lớp] của bạn"? (Lưu ý rằng khóa trên một phương thức cá thể chỉ được lấy ra trên chính đối tượng đó). Cũng lưu ý rằng JVM hiện đại là cực kỳ tiên tiến và chi phí hoạt động của đồng bộ hóa thường không phải là vấn đề –
Tôi có một jsp nơi nhiều người truy cập/cập nhật dữ liệu. dữ liệu nằm trong một đối tượng bộ nhớ cache và ở đó tôi cần những đồng bộ hóa và et al vì số lượng người có thể rất nhiều. – DKSRathore
Tôi nghĩ tôi nên đi với AomicDouble. – DKSRathore