Khi nào nên sử dụng AtomicReferenceArray
khi nào? Hãy giải thích với một ví dụ.Việc sử dụng AtomicReferenceArray là gì?
Trả lời
có vẻ như nó có chức năng tương đương với AtomicReference[]
, chiếm ít bộ nhớ hơn một chút.
Vì vậy, nó hữu ích khi bạn cần hơn một triệu tài liệu tham khảo nguyên tử - không thể nghĩ ra bất kỳ trường hợp sử dụng nào.
Nó có thể hữu ích nếu bạn có một số lượng lớn các đối tượng được cập nhật đồng thời, ví dụ như trong một trò chơi nhiều người chơi lớn.
Bản cập nhật của tài liệu tham khảo i
sẽ đi theo mô hình
boolean success = false;
while (!success)
{
E previous = atomicReferenceArray.get(i);
E next = ... // compute updated object
success = atomicReferenceArray.compareAndSet(i, previous, next);
}
Tùy thuộc vào hoàn cảnh này có thể nhanh hơn và/hoặc dễ dàng hơn để sử dụng hơn so với khóa (synchronized
).
Nếu bạn có một mảng tham chiếu đối tượng được chia sẻ, thì bạn sẽ sử dụng AtomicReferenceArray
để đảm bảo rằng mảng không thể được cập nhật đồng thời bởi các luồng khác nhau, tức là chỉ có thể cập nhật một phần tử tại một thời điểm.
Tuy nhiên, trong một AtomicReference[]
(mảng AtomicReference
) nhiều chủ đề vẫn có thể cập nhật các phần tử khác nhau một cách mô phỏng, vì nguyên tử là trên các phần tử chứ không phải trên toàn bộ mảng.
Thông tin khác here.
nhiều luồng có thể cập nhật đồng thời các phần tử AtomicReferenceArray. – irreputable
Chúng không thể. Đọc liên kết tôi đã đăng. – dogbane
Vậy sự khác nhau giữa 'AtomicReferenceArray' và' AtomicReference [] 'là gì? Sự thực hiện của Sun là bởi Doug Lea. – dogbane
Một trường hợp sử dụng có thể sẽ là ConcurrentHashMap sử dụng rộng rãi mảng nội bộ. Mảng có thể dễ bay hơi nhưng ở mỗi cấp độ phần tử thì không thể dễ bay hơi. đó là một trong những lý do mảng tự động xuất hiện.
import java.util.concurrent.atomic.AtomicReferenceArray;
public class AtomicReferenceArrayExample {
AtomicReferenceArray<String> arr = new AtomicReferenceArray<String>(10);
public static void main(String... args) {
new Thread(new AtomicReferenceArrayExample().new AddThread()).start();
new Thread(new AtomicReferenceArrayExample().new AddThread()).start();
}
class AddThread implements Runnable {
@Override
public void run() {
// Sets value at the index 1
arr.set(0, "A");
// At index 0, if current reference is "A" then it changes as "B".
arr.compareAndSet(0, "A", "B");
// At index 0, if current value is "B", then it is sets as "C".
arr.weakCompareAndSet(0, "B", "C");
System.out.println(arr.get(0));
}
}
}
// Result:
// C
// C
Bạn có thể giải thích mã này không? – Twisty
không chính xác - xem câu trả lời của fahd cho mô tả. – aperkins
Câu trả lời tốt hơn nhiều so với câu trả lời được chấp nhận. Nó tiết kiệm không gian so với một AtomicReference [] - một bản sao của lớp Unsafe, rất nhiều tham chiếu đối tượng mà nó có thể hoạt động. – themightyjon