2012-05-19 40 views
9

Tôi đã đọc rằng Thread.sleep() sẽ tạm dừng luồng hiện đang chạy trong khoảng thời gian được chỉ định sau khi nó quay trở lại trạng thái runnable chờ đến lượt nó chạy.gọi Thread.sleep() từ bối cảnh được đồng bộ trong Java

Ngoài ra, nếu được gọi từ ngữ cảnh synchronized, sleep() sẽ không giải phóng khóa mà nó giữ. Vì vậy, tôi đã tự hỏi khi nào nó sẽ giải phóng khóa. Nếu thread, đưa vào giấc ngủ, không bao giờ có cơ hội để chạy vì vậy nó sẽ luôn luôn giữ cho khóa với chính nó và sau đó làm thế nào các chủ đề khác có được nhập vào đồng bộ phương pháp/khối.

Tôi không chắc chắn nếu tôi đang đặt câu hỏi hợp lệ. Nhưng hãy giúp tôi.

Trả lời

16

Vì vậy, tôi đã tự hỏi khi nào nó sẽ giải phóng khóa.

Nó sẽ giải phóng khóa khi thoát khỏi khối synchronized và không được khóa trước đó.

Nếu chủ đề, đặt vào chế độ ngủ, không bao giờ có cơ hội chạy nên nó sẽ luôn giữ khóa và sau đó các chủ đề khác sẽ nhập các phương thức/khối đồng bộ.

Rất đơn giản, các chủ đề khác sẽ không thể nhập mã được đồng bộ trên cùng một đối tượng là chủ đề đang ngủ.

Để tóm tắt, hãy gọi Thread.sleep() từ khối synchronized có thể không phải là một ý tưởng hay.

+2

Thực sự, gọi 'Thread.sleep()' có thể không phải là một ý tưởng hay. Nếu có điều gì đó bạn có thể làm bây giờ, bạn nên làm ngay bây giờ. Nếu bạn phải chờ đợi một cái gì đó trước khi có bất cứ điều gì bạn có thể làm, bạn nên chờ đợi cho rằng một cái gì đó chứ không phải là ngủ. –

+2

@DavidSchwartz: Tôi đồng ý. Mặc dù có sử dụng hợp pháp cho 'Thread.sleep()', nó thường được sử dụng ở nơi không nên. – NPE

+0

Cũng giải thích, nhưng nói "Để tóm tắt, gọi Thread.sleep() từ một khối đồng bộ có thể không phải là một ý tưởng tốt." đang đi quá xa. Đôi khi bạn muốn chờ và giữ khóa. – Jesus

13

Nếu bạn sử dụng Object.wait thay vì Thread.sleep, khóa từ khối được đồng bộ hóa sẽ được giải phóng.

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