2010-11-19 35 views
5

Tôi thấy điều này:Điều này có được không? Đồng bộ (chủ đề), sau đó là thread = null trong khối đồng bộ

// thread is a member of this class 

synchronized(this.thread) 
{ 
    this.thread.running = false; 
    this.thread.notifyAll(); // Wake up anything that was .waiting() on 
    // the thread 
    this.thread = null; // kill this thread reference. 
    // can you do that in a synchronized block? 
} 

Is it ok để thiết lập thread=null trong khi vẫn giữ một khóa trên nó?

Tôi tìm thấy nugget này bằng một chút mã BB.

+1

Có lý do nào bạn không sử dụng Thread.interrupt() vì điều này được hỗ trợ bởi các thư viện cơ bản không? –

Trả lời

7

Vâng, được rồi. Câu lệnh được đồng bộ hóa sẽ lấy một bản sao tham chiếu mà nó đang khóa và sử dụng bản sao để tìm ra những gì cần mở khóa ở cuối.

Section 14.19 Đặc tả ngôn ngữ Java không thực sự rõ ràng về điều này, nhưng nó không tuyên bố rằng biểu thức được đánh giá lúc bắt đầu - và không đề cập đến việc đánh giá lại sau này.

+0

Tốt, nhưng có vấn đề là liệu việc đặt tham chiếu chuỗi thành null là một ý hay. – Adamski

+1

@Adamski: Tôi có xu hướng xem một cách hợp lý về những gì tôi đồng bộ hóa ở nơi đầu tiên thành thật - tôi nghĩ mình nên tránh đi vào đó :) –

+0

Đồng ý - Thực tế IntelliJ cảnh báo tôi trong tình huống này về việc đồng bộ hóa một biến không phải cuối cùng. – Adamski

3

Có một sự khác biệt:

synchronized(this.thread) 

Bạn đang đồng bộ hóa trên Object lĩnh vực này this.thread điểm để

this.thread = null; 

Bạn đang reassigning lĩnh vực này. Bạn không làm bất cứ điều gì với đối tượng mà bạn đã tham chiếu ở trên, vì vậy khóa vẫn hợp lệ.

0

Bạn có thể làm điều đó, nhưng nó gần như chắc chắn rằng mã là sai cho bất cứ điều gì nó đang cố gắng để đạt được. Đăng toàn bộ mã và tôi đảm bảo rằng rõ ràng là lập trình viên không hiểu đồng thời.

Không gán lại biến được sử dụng để đồng bộ hóa.

0

Bạn chỉ gặp sự cố nếu bạn cũng có một khối chỉ định giá trị mới cho chuỗi. Trong trường hợp đó, bạn có một điều kiện chủng tộc khi hai khối không khóa trên cùng một đối tượng, nhưng sẽ cập nhật cùng một trường và sẽ ngẫu nhiên khi khối nào gán giá trị cuối cùng.

1

Biểu thức được đồng bộ hóa không được tham chiếu khi nhập, vì vậy bất kỳ người dùng nào sau này của khóa này sẽ nhận được NullPointerException. Bạn có thể làm việc xung quanh bằng cách đặt một kiểm tra null trước khối đồng bộ, nhưng sau đó bạn đã giới thiệu một điều kiện chủng tộc.

+0

'Đã đánh giá' khi nhập. – EJP

+3

@EJP nhiều hơn được đánh giá - một biểu thức đánh giá thành null không gây ra NullPointerException. –

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