2010-02-10 36 views
31

Có cách nào khai báo các phần tử mảng volatile trong Java không? I E.Làm thế nào để khai báo các phần tử mảng dễ bay hơi trong Java?

volatile int[] a = new int[10]; 

tuyên bố tham khảo mảngvolatile, nhưng phần tử mảng (ví dụ a[1]) vẫn chưa ổn định. Vì vậy, tôi đang tìm một cái gì đó như

volatile int[] a = new volatile int[10]; 

nhưng nó không hoạt động theo cách đó. Có thể ở tất cả?

+0

@Kanagavelu Sugumar: AtomicReference _is_ một gói 'bay hơi', với một số phương thức bổ sung (getAndSet v.v.). –

Trả lời

27

Sử dụng AtomicIntegerArray hoặc AtomicLongArray hoặc AtomicReferenceArray

Lớp AtomicIntegerArray thực hiện một mảng int mà các lĩnh vực cá nhân có thể được truy cập với ngữ nghĩa dễ bay hơi, qua get()set() phương thức của lớp. Gọi số arr.set(x, y) từ một chuỗi sau đó sẽ đảm bảo rằng một chuỗi khác gọi arr.get(x) sẽ đọc giá trị y (cho đến khi một giá trị khác được đọc đến vị trí x).

Xem:

+0

Tôi tự hỏi tại sao có 'AtomicArrays' cụ thể cho int và dài, nhưng không phải cho các kiểu nguyên thủy khác ... Nhưng tất nhiên phần còn lại của các nguyên thủy có thể được giả mạo bằng cách sử dụng trình bao bọc của chúng trong một 'AtomicReferenceArray'. –

+0

Tôi nghĩ AtomicIntegerArray và AtomicLongArray được tối ưu hóa để làm việc với số nguyên và dài tương ứng. – uthark

+4

@JoonasPulakka cho các loại nguyên thủy khác, bạn cũng có thể chuyển đổi chúng thành int hoặc dài bằng cách sử dụng ví dụ: 'Float.floatToIntBits (float)'. Điều này tránh được sự cần thiết của boxing khi sử dụng 'AtomicReferenceArray'. –

6

Không, bạn không thể làm cho các phần tử mảng dễ bay hơi. Xem thêm http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html.

+0

Thực tế bạn có thể, nhưng với những nỗ lực bổ sung. – uthark

+0

Về mặt kỹ thuật, điều đó vẫn không làm cho các phần tử dễ bay hơi, nhưng các hoạt động mảng là dễ bay hơi. Vì 'int' cho trường hợp này là nguyên thủy, về cơ bản nó có cùng một hành vi, nhưng điều này không thể dễ dàng mở rộng cho các mảng không nguyên thủy. – Marcus

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