2015-01-12 14 views
6

Tôi biết rằng kiểm tra lại khóa mà không biến không ổn định là không an toàn dựa vào liên kết này http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.htmlLàm thế nào để phá vỡ khóa kiểm tra kép mà không dễ bay hơi

class Foo { 
    private Helper helper = null; 
    public Helper getHelper() { 
     if (helper == null) { 
      synchronized(this) { 
       if (helper == null) { 
        helper = new Helper(); 
       } 
      } 
     } 
     return helper; 
    } 
} 

Tôi muốn mô phỏng tình trạng này tại máy tính ở nhà của tôi. Tôi có tiêu chuẩn jdk1.7 và bộ xử lý đa lõi. Nhưng tôi không thể mô phỏng hành vi bị hỏng. Tôi đang sử dụng thử nghiệm này http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckTest.java mà nên mô phỏng này. Tôi cũng tạo một số thử nghiệm của mình nhưng không thành công. Bạn có bất kỳ ý tưởng làm thế nào để mô phỏng tình hình khi thành ngữ kiểm tra kép này mà không dễ bay hơi bị hỏng? Vì vậy, nó sẽ trả về lớp Helper được tạo một phần.

+3

Vấn đề là bạn có thể đang chạy với bộ xử lý x86. Từ những gì tôi biết họ phát hành một rào cản StoreLoad sau khi xây dựng đối tượng như vậy trong trường hợp đó bạn sẽ không thấy một đối tượng được xây dựng một phần. Nếu bạn có thể nhận được một sparc hoặc hệ thống khác xử lý xây dựng khác nhau, bạn có lẽ sẽ có thể nhìn thấy vấn đề. –

Trả lời

0

Trên x86, nó đòi hỏi hoặc là một lớp học với số lượng lớn các lĩnh vực, vì vậy mà các cửa hàng khởi tràn qua ấn phẩm, như thế này: http://cs.oswego.edu/pipermail/concurrency-interest/2015-January/013861.html

Hoặc, bạn phải munge trình biên dịch để ngẫu nhiên hướng dẫn lên lịch. Trên các kiến ​​trúc không phải TSO như ARM, điều này có thể được thể hiện mà không có bất kỳ thủ thuật nào, xem: http://shipilev.net/blog/2014/safe-public-construction/#_correctness

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