Câu trả lời không đơn giản như vậy. Có thể có trường hợp các luồng đi vào trạng thái bị chặn có thể sẽ dẫn đến việc sử dụng CPU.
Hầu hết các JVM sử dụng thuật toán khóa theo cấp. Các thuật toán thường liên quan như spinlocks đặc biệt cho các khóa được giữ trong một thời gian ngắn. Khi một luồng cố gắng lấy được một màn hình và không thể tìm thấy nó, JVM có thể thực sự đặt nó vào một vòng lặp và có chủ đề cố gắng để có được màn hình, thay vì bối cảnh chuyển đổi nó ra ngay lập tức. Nếu luồng không lấy được khóa sau một số lần thử hoặc thời gian nhất định (tùy thuộc vào việc triển khai JVM cụ thể), JVM sẽ chuyển sang chế độ "khóa chất béo" hoặc "khóa tăng tốc", trong đó ngữ cảnh chuyển đổi chuỗi.
Đó là với hành vi spinlock nơi bạn có thể phải chịu chi phí CPU. Nếu bạn có mã giữ khóa trong một thời gian rất ngắn và tranh chấp là cao, sau đó bạn có thể thấy vết sưng đáng kể trong việc sử dụng CPU. Đối với một số cuộc thảo luận về các kỹ thuật khác nhau mà các JVM sử dụng để giảm chi phí tranh chấp, hãy xem http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html.
Đi theo câu trả lời được đăng bởi @sjlee, tôi đã biết rằng nếu spinlock có liên quan đến chủ đề bị chặn thì điều này sẽ dẫn đến việc sử dụng CPU. Do đó, bạn không nghĩ rằng nói rằng các chủ đề bị chặn được chi phí ít ** luôn luôn ** là giả định ** mạnh **? –
Xin hãy tha thứ cho tôi nhưng tôi thực sự muốn biết ý kiến của bạn về bình luận trước đó của tôi. Hoặc, bất kỳ liên kết hoặc con trỏ đến chủ đề này sẽ là tuyệt vời! –
@VishalK Chuỗi chi phí bị chặn ít hơn nếu chúng bị chặn trong một thời gian tương đối dài. ví dụ. hàng chục mili giây. Trong khoảng thời gian rất ngắn, việc chặn có thể có chi phí cao. –