thể trùng lặp:
What is the best way to increase number of locks in javaĐồng bộ hóa trên một giá trị Integer
Giả sử tôi muốn khóa dựa trên một giá trị số nguyên id. Trong trường hợp này, có một hàm kéo giá trị từ bộ nhớ cache và thực hiện việc truy xuất/lưu trữ khá tốn kém vào bộ đệm nếu giá trị không có.
Các mã hiện không đồng bộ và có khả năng có thể gây ra nhiều lấy/cửa hàng hoạt động:
//psuedocode
public Page getPage (Integer id){
Page p = cache.get(id);
if (p==null)
{
p=getFromDataBase(id);
cache.store(p);
}
}
Những gì tôi muốn làm là đồng bộ lấy trên id, ví dụ
if (p==null)
{
synchronized (id)
{
..retrieve, store
}
}
Thật không may điều này sẽ không hoạt động vì 2 cuộc gọi riêng biệt có thể có cùng giá trị id Integer nhưng đối tượng Integer khác nhau, vì vậy chúng sẽ không chia sẻ khóa và không đồng bộ hóa.
Có cách nào đơn giản để đảm bảo rằng bạn có cùng một phiên bản Integer không? Ví dụ, sẽ làm việc này:
syncrhonized (Integer.valueOf(id.intValue())){
Các javadoc cho Integer.valueOf() dường như ngụ ý rằng bạn có khả năng để có được những ví dụ tương tự, nhưng điều đó không trông giống như một bảo lãnh:
Trả về phiên bản Số nguyên biểu thị giá trị int được chỉ định. Nếu một trường hợp Integer mới không yêu cầu, phương pháp này nên thường được sử dụng trong ưu tiên cho constructor Integer (int), như phương pháp này có khả năng mang lại không gian tốt hơn đáng kể và thời gian hiệu suất của bộ nhớ đệm thường xuyên đã yêu cầu giá trị.
Vì vậy, bất kỳ đề xuất nào về cách nhận một phiên bản Integer được đảm bảo giống nhau, ngoài các giải pháp phức tạp hơn như giữ một đối tượng WeakHashMap of Lock được khóa vào int? (không có gì sai với điều đó, nó chỉ có vẻ như phải có một lớp lót rõ ràng hơn tôi đang mất tích).
Câu hỏi "trùng lặp" này và câu trả lời của Eddie bên dưới tốt hơn câu hỏi "gốc"! – arun
Xem thêm http://stackoverflow.com/questions/6616141/java-threads-locking-on-a-specific-object cụ thể http://stackoverflow.com/a/27806218/32453 – rogerdpack
Điều gì về việc sử dụng [AtomicInteger] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html)? – GregT