2013-03-18 42 views
5

Nếu bạn khai báo biến thành viên là biến động trong Java, điều này có nghĩa là tất cả dữ liệu của đối tượng được lưu trữ trong bộ nhớ dễ bay hơi, hoặc tham chiếu đến đối tượng được lưu trữ trong bộ nhớ dễ bay hơi?Khai báo một đối tượng dễ bay hơi

Ví dụ nếu tôi có lớp sau:

class C{ 
    int i = 0; 
    char c = 'c'; 
} 

Nếu tôi tuyên bố một thể hiện của nó như sau:

private volatile C obj; 

nào đó lưu trữ các tài liệu tham khảo để obj trong bộ nhớ không ổn định, hoặc obj Dữ liệu của (obj.iobj.c) trong bộ nhớ volatile?

Nó có làm cho an toàn obj.cobj.i chủ đề an toàn hay không?

+2

Hướng dẫn Java SE 6 không chỉ định từ khóa 'volatile' làm đối tượng lưu trữ trong bộ nhớ dễ bay hơi, nhưng nó đảm bảo đọc và viết là nguyên tử. http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html – gerrytan

+0

Tất cả các biến được lưu trữ trong bộ nhớ dễ bay hơi (ví dụ: RAM), bất kể biến tố 'bay hơi '. http://en.wikipedia.org/wiki/Volatile_memory –

+0

@gerrytan dễ bay hơi không nhiều về nguyên tử, nó là về khả năng hiển thị. – assylias

Trả lời

8

Có chỉ tham chiếu đối tượng sẽ được coi là không ổn định bởi JVM và không phải là đối tượng dữ liệu chính nó sẽ nằm trên heap. Nếu bạn yêu cầu các biến thành viên của đối tượng trên heap là dễ bay hơi bạn tất nhiên có thể áp dụng các từ khóa để những nguyên thủy

class C { 
    volatile int i = 0; 
    volatile char c = 'c'; 
} 

Re: câu hỏi của bạn cho dù điều này làm cho các chủ đề biến an toàn, phụ thuộc vào cách bạn sử dụng biến. Như @gerrytan đã chỉ ra từ các tài liệu của Oracle, từ khóa dễ bay hơi không giúp đọc hoặc ghi là nguyên tử, tuy nhiên được cảnh báo rằng điều này không giống như nó luôn luôn là chủ đề an toàn. Xét đoạn mã sau ...

if(obj != null) { 
    obj.doSomething(); 
} 

Nó vẫn có thể là một chủ đề mà thực hiện việc kiểm tra null, bị gián đoạn trước khi nó thực thi obj.doSomething(), và thread khác đặt obj = null. Một số cơ chế khác được yêu cầu ở đây chẳng hạn như khối synchronized.

+0

câu trả lời tuyệt vời indepath :) cảm ơn! – user965369

3
private volatile C obj; 

Điều đó sẽ chỉ làm cho obj dễ bay hơi.

Có làm cho chuỗi obj.c và obj.i an toàn hay không?

Không. Để đảm bảo an toàn cho chủ đề, bạn phải đồng bộ hóa quyền truy cập vào chúng.

+1

Điều này phản ánh nguyên tắc chung mà _instances_ của một lớp không phải là chủ đề an toàn hay không; _classes_ là thread an toàn hay không. –

2

Điều này sẽ chỉ làm cho tham chiếu đối tượng dễ bay hơi. Để thực hiện obj.i và obj.c cũng dễ bay hơi bạn phải làm cho họ dễ bay hơi rõ ràng

class C{ 
    volatile int i = 0; 
    volatile char c = 'c'; 
} 
1

Nếu bạn khai báo biến thành viên là biến động trong Java, điều này có nghĩa là tất cả dữ liệu của đối tượng được lưu trữ trong bộ nhớ dễ bay hơi hoặc tham chiếu đến đối tượng được lưu trữ trong bộ nhớ dễ bay hơi?

Khi chúng tôi khai báo đối tượng là dễ bay hơi, chúng tôi đang thực sự nói cho bộ vi xử lý cơ bản cách làm việc với đối tượng dễ bay hơi.Thời gian được đọc bằng lệnh CPU một bản sao mới được gọi từ Heap và mỗi lần ghi được thực hiện trên đối tượng nó được lưu vào đống và có sẵn cho các chủ đề khác.Do đó, bộ xử lý không chọn từ bộ nhớ cache giá trị cũ không phải nó ghi vào bộ nhớ cache và chờ cache được ghi lại cho Heap.

Có làm cho chuỗi obj.c và obj.i an toàn hay không? Nó chỉ là gurantees rằng bạn sẽ luôn luôn có một bản sao tươi khi bạn sẽ đọc đối tượng. Và nó là rất tốt có thể là trong khi bạn sử dụng biến và xử lý logic dựa trên giá trị varilable ai đó có thể đã thay đổi giá trị trong nền và khi bạn đã cập nhật nó, bạn đang cập nhật một giá trị khác.

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