2015-10-06 16 views
5

Biến số emitting có dễ bay hơi không? phương pháp emit() được gọi từ các chủ đề khác nhau và phát ra phải được hiển thị.
Nhưng chỉ được truy cập trong các khối synchronized. Các // ... là những nơi mà công việc được thực hiện, nhưng emitting không được tham chiếu ở đây.Là cần thiết bay hơi, trong trường hợp chỉ truy nhập được đồng bộ

Vì vậy, nếu cấu trúc của synchronized được khắc phục, tôi vẫn cần volatile cho emitting hay không? (Và tại sao?)

static final class C { 
    boolean emitting = false; // shall be volatile ? 

    public void emit() { 
     synchronized (this) { 
      if (emitting) { 
       return; 
      } 
      // ... 
      emitting = true; 
     } 

     // ... 

     synchronized (this) { 
      if (!condition()) { 
       emitting = false; 
       return; 
      } 
     } 
     // ... 
    } 

Frank

Trả lời

5

Nếu nó được truy cập chỉ từ synchronized khối là không cần thiết từ khóa volatile.

Đảm bảo đồng bộ rằng các thay đổi đối với các biến được truy cập bên trong khối được đồng bộ hóa được hiển thị cho tất cả các chuỗi nhập một khối được đồng bộ hóa.

Từ cuốn sách Java đồng thời trong thực tế:

Để xuất bản một đối tượng an toàn, cả hai tham chiếu đến đối tượng và trạng thái của đối tượng phải được thực hiện có thể nhìn thấy chủ đề khác cùng thời gian. Một đối tượng được xây dựng đúng cách có thể được xuất bản một cách an toàn bằng cách:

  • Khởi tạo tham chiếu đối tượng từ trình khởi chạy tĩnh;
  • Lưu trữ tham chiếu đến trường đó vào trường dễ bay hơi hoặc Tham chiếu nguyên tử ;
  • Lưu trữ tham chiếu đến trường đó vào trường cuối cùng của đối tượng được tạo đúng;
  • Lưu trữ tham chiếu đến trường đó vào đúng trường được bảo vệ bằng khóa.

Lưu ý:bảo vệ bởi một khóa có nghĩa là nhập vào một khối đồng bộ

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