2011-04-19 29 views
18

Theo nhiều, thành ngữ Khóa đôi được kiểm tra đôi chút bị hỏng cho java trừ khi bạn đang chạy 1.5 hoặc mới hơn và sử dụng từ khóa volatile.Khóa đã kiểm tra đôi trong Android

Một chia đôi kiểm tra mẫu khóa:

// Broken multithreaded version 
// "Double-Checked Locking" idiom 
class Foo { 
    private Helper helper = null; 
    public Helper getHelper() { 
    if (helper == null) 
     synchronized(this) { 
     if (helper == null) 
      helper = new Helper(); 
     }  
    return helper; 
    } 
    // other functions and members... 
    } 

Mẫu xuất phát từ bài viết này, mà còn cung cấp thêm chi tiết về làm thế nào để sửa chữa nó: phân tích http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

Pugh của trên là dành cho Java VM. Tôi làm việc trên Android và thường xuyên sử dụng các thư viện sử dụng Khóa đôi được kiểm tra. Mô hình bộ nhớ của máy ảo dalvik có hỗ trợ thành ngữ này không?

+0

Bạn có thể đoán tại đó tôi đang xem;) – Snicolas

Trả lời

10

Câu trả lời cho điều này question ngụ ý rằng các mô hình bộ nhớ phải giống nhau và rằng thành ngữ khóa kép đã kiểm tra mới sẽ hoạt động.

+1

Yup. Với việc bổ sung các từ khóa "dễ bay hơi", điều này sẽ làm việc trên uniprocessor (tất cả các phiên bản của Android) và SMP (3.0 "tổ ong" và sau này). – fadden

+0

Nếu không, trước khi tổ ong, là kiểm tra khóa kép với các trường không dễ bay hơi có thể? @ Fadden BTW, có bất kỳ cuộc gọi phản ánh bộ nhớ đệm trong lớp java.lang.Class Dalvik? Bởi caching tôi có nghĩa là có một số thế hệ bytecode giống như trên java VM: stackoverflow.com/a/414823/693752 – Snicolas

+1

Bạn cần sử dụng một số loại hoạt động đồng bộ hóa ('volatile',' synchronized', vv) như được hiển thị trên Pugh's trang web. Ví dụ bị hỏng trong câu hỏi là, tốt, bị hỏng, và không nên được sử dụng. Việc thực hiện các phản ánh trong Dalvik đã thay đổi một chút công bằng theo thời gian, vì vậy bạn sẽ phải xem mã cho một bản phát hành nhất định để biết chính xác những gì nó làm. Tôi tin rằng có một số bộ nhớ đệm, nhưng theo hiểu biết tốt nhất của thế hệ bytecode không phải là một trong những kỹ thuật được sử dụng. – fadden

0

Tôi tìm thấy một bài viết rất tốt về câu hỏi rằng: http://www.javamex.com/tutorials/double_checked_locking_fixing.shtml

Nó nêu rõ 3 cách để giải quyết DCL. Và có vẻ như trong câu hỏi của bạn, trường Helper nên được khai báo dễ bay hơi, nếu không nó sẽ không hoạt động.

Khi nói đến việc sử dụng, ví dụ: RoboGucie trong trường hợp của bạn, tôi nghĩ tôi sẽ ưu tiên phương thức trình tải lớp được đề cập trong bài viết. Nó rõ ràng hơn với tôi và hiệu quả.

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