2012-06-30 35 views
11

Tôi đã quét tất cả java documentation trên các câu hỏi synchronized tìm câu trả lời cho câu hỏi này mà không có may mắn.Đơn đặt hàng được đồng bộ hóa

Giả sử tôi có thread1, thread2, thread3 cố gắng chạy tất cả các mã sau cùng một lúc.

synchronized(lockObj) { 
    doSomething(); 
} 

Giả thread1 được đầu tiên doSomething(), thread2 sau đó thread3 mà sẽ ngăn chặn và chờ vào báo cáo kết quả synchronized.

Câu hỏi

  1. Khi thread1 phát hành khóa, trong đó các chủ đề sẽ được phát hành đầu tiên?
  2. Quy tắc đặt hàng chung áp dụng khi phát hành khóa là gì?
+0

Tại sao không chỉ cần sử dụng một BlockingQueue như một [ArrayBlockingQueue] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html) hoặc một cái gì đó tương tự? Hay tôi không hiểu câu hỏi của bạn. –

+2

Tôi sẽ tóm tắt nó trong một thuật ngữ duy nhất: các chủ đề chờ đợi trên màn hình được nhập ngũ trong một thời gian chờ [** set **] (http://docs.oracle.com/javase/specs/jls/se7/html/jls -17.html # jls-17.2). –

+1

@HovercraftFullOfEels Sự nhầm lẫn của tôi thực sự bắt đầu sau khi đọc mã này http://www.tutorialspoint.com/java/java_thread_synchronization.htm Tôi luôn nghĩ rằng ổ khóa được quản lý theo cách FIFO nhưng dường như không phải – GETah

Trả lời

21

1. Hoặc là chuỗi 2 hoặc thread3. Không có đảm bảo:

Tương tự như vậy, không có giả định nên được thực hiện về thứ tự trong đó chủ đề được cấp quyền sở hữu một màn hình hoặc thứ tự mà bài đánh thức để đáp ứng với các thông báo hoặc notifyAll phương pháp

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/thread-priorities.html#general

2. Màn hình Java (đồng bộ/chờ/thông báo/thông báoAll) không công bằng. Các nguyên tắc đồng bộ hóa từ java 1.5 thường có các tham số để thực thi tính công bằng. Xin lưu ý rằng phiên bản hợp lý có hình phạt hiệu suất đáng kể, thường là phiên bản không công bằng nên được sử dụng: thống kê, mọi chuỗi sẽ có cơ hội để chạy, ngay cả khi lệnh đó không được thi hành nghiêm ngặt.

Chương trình sử dụng khóa công bằng được nhiều chủ đề truy cập có thể hiển thị thông lượng tổng thể thấp hơn (tức là chậm hơn; thường chậm hơn nhiều) so với sử dụng cài đặt mặc định, nhưng có chênh lệch nhỏ hơn để có khóa và đảm bảo thiếu đói. Tuy nhiên, lưu ý rằng sự công bằng của ổ khóa không đảm bảo tính công bằng của việc lên lịch chuỗi. Do đó, một trong nhiều chủ đề sử dụng khóa công bằng có thể nhận được nhiều lần liên tiếp trong khi các chuỗi hoạt động khác không tiến triển và hiện không giữ khóa. Cũng lưu ý rằng phương pháp tryLock chưa được chỉnh sửa không tôn trọng cài đặt công bằng. Nó sẽ thành công nếu khóa có sẵn ngay cả khi các chủ đề khác đang chờ đợi.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html#ReentrantLock%28boolean%29

+0

+1 cho liên kết! – GETah

+1

hmm, tôi biết không có đảm bảo với luồng, nhưng tôi luôn tưởng tượng hàng đợi khóa, bạn biết đấy, hàng đợi, với năm mươi và tất cả mọi thứ. Câu trả lời hay. –

+0

@DenisTulskiy JLS không bao giờ đề cập đến hàng đợi, mà là một bộ. Đó là tuyệt vời khi nói nó là tất cả. –

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