Việc lấy của tôi sẽ không có sự khác biệt giữa hai, ngoại trừ khối đồng bộ có thể được bản địa hóa hơn trong phạm vi và do đó khóa sẽ có thời gian ít hơn ??
Có. Bạn đúng rồi. Không giống như phương thức synchronized
, các câu lệnh đồng bộ phải chỉ định đối tượng cung cấp khóa nội tại.
Ví dụ từ java hướng dẫn:
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
báo cáo đồng bộ cũng hữu ích cho việc cải thiện đồng thời với đồng bộ hóa hạt mịn. Bạn có thể tìm thấy ví dụ tốt trên cùng một trang hướng dẫn cho trường hợp sử dụng bên dưới.
Giả sử, ví dụ: lớp MsLunch
có hai trường mẫu, c1 và c2, không bao giờ được sử dụng cùng nhau. Tất cả các bản cập nhật của các trường này phải là synchronized
, nhưng không có lý do gì để ngăn cập nhật c1 bị xen kẽ với bản cập nhật c2 - và làm như vậy sẽ giảm đồng thời bằng cách tạo chặn không cần thiết. Thay vì sử dụng các phương pháp đã đồng bộ hóa hoặc bằng cách khác, sử dụng khóa liên kết với điều này, chúng tôi chỉ tạo hai đối tượng để cung cấp khóa.
Và trong trường hợp Khóa trên phương pháp tĩnh, Khóa được lấy là gì? Ý nghĩa của Khóa trên Lớp là gì?
Trong trường hợp này, chuỗi sẽ lấy khóa nội tại cho đối tượng Lớp được liên kết với lớp. Do đó việc truy cập vào các trường tĩnh của lớp được điều khiển bởi một khóa khác với khóa cho bất kỳ cá thể nào của lớp.
Khi bạn thực hiện một phương pháp như synchronized (không static
):
Nó không phải là có thể cho hai lời gọi của synchronized
phương pháp trên cùng một đối tượng để interleave. Khi một luồng đang thực hiện một phương thức đồng bộ cho một đối tượng, tất cả các luồng khác gọi ra các phương thức đồng bộ cho cùng một khối đối tượng (tạm dừng thực hiện) cho đến khi luồng đầu tiên được thực hiện với đối tượng.
Nếu bạn thực hiện một phương pháp như static synchronized
:
Nó không phải là có thể cho hai lời gọi của static synchronized
phương pháp trên các đối tượng khác nhau của cùng một lớp để interleave. Khi một luồng đang thực hiện phương thức static synchronized
cho đối tượng lớp A, tất cả các luồng khác gọi phương thức static synchronized
trên bất kỳ đối tượng nào của khối lớp A (tạm ngừng thực thi) cho đến khi chuỗi đầu tiên được thực hiện với phương thức thực hiện.
Bạn tìm thấy lựa chọn thay thế tốt hơn để đồng bộ hóa trong câu hỏi SE này:
Avoid synchronized(this) in Java?
@ try-catch-cuối cùng Đó không phải là một bản sao của câu hỏi này; câu hỏi đó hỏi liệu một phương thức đồng bộ có cung cấp quyền truy cập độc quyền vào phương thức duy nhất hay cho toàn bộ đối tượng hay không. –
@MarkRotteveel Bạn nói đúng về các tiêu đề khác nhau. Mặt khác, các câu trả lời của câu hỏi khác cũng đề cập đến sự khác biệt: điều chỉnh phần đồng bộ hóa với một số câu lệnh (hoặc không) và kiểm soát nơi khóa (hoặc không kiểm soát được). –