2011-05-05 24 views
10

tôi muốn hỏi liệu Java có sử dụng nhiều tài nguyên CPU hơn khi các luồng bị chặn hay không, tức là chờ khóa màn hình hiện đang bị khóa bởi một luồng khác.Các luồng Java bị chặn có chiếm nhiều tài nguyên CPU hơn không?

Tôi hiện đang xem xét một chuỗi kết xuất theo đó một số luồng bị chặn vì chúng đang chờ khóa màn hình và tôi không chắc liệu đó có phải là điều có thể chịu trách nhiệm về việc sử dụng CPU cao hay không.

Cảm ơn!

EDIT (6 tháng 5 năm 2011) Tôi quên đề cập đến nếu hành vi này có liên quan đến Java SE 1.4.2.

Trả lời

20

Chủ đề tiêu thụ tài nguyên như bộ nhớ. Chủ đề chặn/bỏ chặn phát sinh chi phí một lần. Nếu một thread chặn/unblocks hàng chục ngàn lần mỗi giây, điều này có thể lãng phí một lượng đáng kể của CPU.

Tuy nhiên sau khi một chuỗi bị chặn, không quan trọng nó bị chặn trong bao lâu, không có chi phí liên tục.

+0

Đ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 **? –

+0

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! –

+1

@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. –

2

Không, chủ đề bị chặn trên màn hình làm không mất thêm thời gian CPU.

1

Chuỗi bị treo hoặc bị chặn không tiêu tốn bất kỳ thời gian CPU nào.

13

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.

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