2010-09-29 51 views

Trả lời

6

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.

+0

không chính xác - xem câu trả lời của fahd cho mô tả. – aperkins

+1

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

1

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).

8

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.

+1

nhiều luồng có thể cập nhật đồng thời các phần tử AtomicReferenceArray. – irreputable

+0

Chúng không thể. Đọc liên kết tôi đã đăng. – dogbane

+0

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

1

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.

0
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 
+1

Bạn có thể giải thích mã này không? – Twisty

Các vấn đề liên quan