2010-09-10 51 views
7

Tôi đang viết một ứng dụng cho Android và đang sử dụng các chuỗi công nhân để xử lý một số thông tin nhất định. Có đọc qua mã của tôi bây giờ tôi không chắc chắn nếu nó là thread an toàn.Chủ đề này có an toàn không?

Tôi đã viết một phiên bản đơn giản của mã của mình, tôi đã bỏ qua đối tượng Handler được sử dụng để giao tiếp với luồng chính và rõ ràng là chính quy trình đó.

public class myClass implements Runnable 
{ 
    private String myString; 

    @Override 
    public void run() 
    { 
     myString = "Some Value"; 
    } 
} 

Điều này được gọi bằng cách chạy một cái gì đó tương tự như thế này.

myClass class = new myClass(); 
Thread thread = new Thread(class); 
thread.start() 

Vì vậy, được mã này không đề an toàn bởi vì tôi đang sửa đổi myString (khai báo trong các chủ đề chính) trong run() chức năng?

+0

Câu hỏi của bạn nhắc tôi rất nhiều bài viết này http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe. aspx –

Trả lời

4

Bản thân, đó là an toàn chỉ. Nhưng chuỗi nào sẽ là đọc giá trị myString? Nếu bạn đọc nó từ chuỗi chính sau khi viết nó trong chủ đề mới, thì không phải là an toàn chỉ.

2

Không, như bạn đã trình bày, đó là luồng an toàn. Nếu bạn thực hiện một getter cho biến myString, bạn có một vấn đề luồng tiềm năng. Trong trường hợp đó, bạn sẽ muốn làm cho phương thức getter/setter được đồng bộ hóa, hoặc tốt hơn là làm cho biến biến động, điều này sẽ đảm bảo rằng giá trị của biến là giống nhau cho mỗi luồng.

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