2011-10-06 42 views
7

Tôi nhận ra rằng khối đồng bộ được cung cấp trong Java về cơ bản là thực hiện một mutex tái nhập. Tuy nhiên là khối nguyên tử đồng bộ?Khối được đồng bộ hóa - Java

Vậy các ngắt được xử lý như thế nào cho các chuỗi hiện đang thực hiện trong khối được đồng bộ hóa - nó có đơn giản giải phóng khóa bằng cách hoàn nguyên tất cả các thay đổi đã thực hiện cho đến thời điểm này không?

CHỈNH SỬA: Liên quan đến phần Gián đoạn của câu hỏi - cách xử lý thông thường trong Java. Ví dụ, tôi thấy nhiều ví dụ mã java trong đó các nhà phát triển bắt một gián đoạn khi (nói) một chủ đề nằm trong hàng chờ đợi. Tuy nhiên trong khối catch tất cả những gì họ làm là in rằng một ngắt đã được nâng lên. Tôi tò mò hơn về những gì thực sự xảy ra với chủ đề đó? Nó có bị xóa khỏi hàng đợi không?

Trả lời

4

- nguyên tử

Khối được đồng bộ hóa giúp thực hiện nguyên tử - nhưng hoạt động dữ liệu của chúng không thể bị ma sát. Để làm cho nội dung trong một khối nguyên tử được đồng bộ hóa, bạn thường sử dụng các cấu trúc dữ liệu nguyên tử như getters và setters, ví dụ, AtomicBoolean.

Có một sự dồi dào các lớp nguyên tử lớn, như mảng int nguyên tử, được hỗ trợ bởi phiên bản java mới nhất.

- làm thế nào ngắt được xử lý:

Ngắt không được xử lý một cách rõ ràng bằng cách đồng bộ hóa - khối đồng bộ chỉ gaurantee đó, trong khi thực hiện, khối không thể trở lại với bởi thread khác.

2

Tuy nhiên, khối nguyên tử đã được đồng bộ hóa chưa?

Có, khối được đồng bộ thực thi rằng khối này và bất kỳ khối nào được đồng bộ hóa trên cùng một đối tượng đều là nguyên tử.

Làm thế nào ngắt được xử lý:

Ngắt là hoàn toàn khác nhau để đồng bộ hóa trong Java. Mỗi Chủ đề có cờ interruptedStatus được đặt bất cứ khi nào bạn gọi interrupt() trên Chủ đề. Các phương thức như Thread.sleep() ném một InterruptedException nếu cờ ngắt được đặt và tạm dừng ngủ.

Lưu ý rằng Thread.sleep() không từ bỏ bất kỳ khóa nào trong thời gian ngủ. Khóa được kết hợp với khối được đồng bộ chỉ được phát hành khi luồng thực thi ra khỏi khối.

+0

Vì vậy, về cơ bản nó là tối đa một lập trình viên để nắm bắt sự kiện gián đoạn và từ bỏ khóa trong trường hợp bên trong khối được đồng bộ hóa? – Hari

+0

@Titan Khối được đồng bộ hóa tương đương với khóa bị khóa, do đó việc từ bỏ khóa được thực hiện đơn giản bằng cách rời khỏi phạm vi đó. Lưu ý rằng các sự kiện ngắt chỉ đơn giản là một cơ chế cho điều khiển Thread cấp thấp - trong khi chúng có thể được sử dụng tại các thời điểm tương tự chúng là các khái niệm trực giao. – Bringer128

1

Vì vậy, về cơ bản nó là tối đa một lập trình viên để nắm bắt sự kiện gián đoạn và từ bỏ khóa trong trường hợp bên trong khối được đồng bộ hóa?

Bạn không phải xử lý khóa. Theo văn bản trong JLS 14.18Tuyên bố đồng bộ:

Nếu thực hiện các khối hoàn bình thường, sau đó khóa là mở khóa và báo cáo kết quả đồng bộ hoàn thành bình thường.Nếu thực thi Khối hoàn thành đột ngột vì bất kỳ lý do gì, thì khóa được mở khóa và tuyên bố đồng bộ sau đó hoàn thành đột ngột vì lý do tương tự.

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