2012-02-14 36 views
26

Các kiểu dữ liệu nguyên thủy như int & short an toàn luồng trong Java? Tôi đã thực thi đoạn mã sau và không thể thấy kết quả mong đợi 500 lần.Các kiểu dữ liệu nguyên thủy có an toàn trong Java

public class SampleThree extends Thread 
{ 
    static long wakeUpTime = System.currentTimeMillis() + (1000*20); 
    static int inT; 
    public static void main(String args[]) 
    { 
     System.out.println("initial:" + inT); 
     for(int i=0; i<500; i++) 
      new SampleThree().start(); 
     try { 
      Thread.sleep(wakeUpTime - System.currentTimeMillis() + (1000*30)); 
      System.out.println("o/p:" + inT); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public void run() 
    { 
     try { 
      long s = wakeUpTime - System.currentTimeMillis(); 
      System.out.println("will sleep ms: " + s); 
      Thread.sleep(s); 
      inT++; // System.out.println(inT); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Ở đây đồng thời 500 luồng sẽ cập nhật biến int inT. Chủ đề chính sau khi chờ hoàn thành cập nhật đồng thời, in giá trị inT.

Tìm ví dụ tương tự here

+9

Không, chúng không phải là chủ đề an toàn. Nếu bạn chỉ có kế hoạch đọc, bạn nên xem xét làm cho các thành viên 'dễ bay hơi'. Nếu bạn có kế hoạch đọc và ghi nó từ các chủ đề khác nhau, bạn nên làm cho nó 'đồng bộ' –

Trả lời

45

Có ba cách thức mà họ không an toàn:

  • longdouble thậm chí còn không được bảo đảm phải được cập nhật nguyên tử (bạn có thể nhìn thấy một nửa của một ghi từ một chủ đề khác)
  • Mô hình bộ nhớ không đảm bảo rằng bạn sẽ thấy các bản cập nhật mới nhất từ ​​một chủ đề trong một chủ đề khác mà không cần thêm các rào cản bộ nhớ của một số loại
  • Hành vi tăng biến không phải là nguyên tử, dù sao thì

Sử dụng AtomicInteger v.v ... cho các thao tác an toàn chỉ.

4

Tôi khuyên bạn nên sử dụng các lớp trong java.util.concurrent.atomic. Chúng được thiết kế cho an toàn luồng và trong một số trường hợp, JVM có thể tận dụng các tính năng phần cứng để tối ưu hóa.

10

Loại nguyên thủy không phải là chủ đề an toàn. Kiểm tra hướng dẫn this.

+0

Điểm mấu chốt là nếu một nguyên thủy được định nghĩa như một phần của một thể hiện của một đối tượng, nguyên thủy đó sẽ nằm trên đống, và không chủ đề an toàn. – okwap

+2

Thật kỳ lạ. Các tài liệu oracle thực sự nói truy cập kiểu nguyên thủy là nguyên tử cho int: https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html – Yamcha

+1

@Parvin, Ngoại trừ các loại nguyên thủy dài và đôi được đảm bảo là nguyên tử. Nếu bạn đang đọc hoặc viết giá trị, chủ đề của nó an toàn cho một thao tác đó. – Pacerier

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