Đã đến lúc không đồng bộ, chờ đợi và thông báo?


13

Có một kịch bản duy nhất (ngoài khả năng tương thích với các JVM cổ đại) mà việc sử dụng synchronizedđược ưu tiên hơn là sử dụng một Lock? Bất cứ ai cũng có thể biện minh cho việc sử dụng waithoặc notifyqua các hệ thống mới hơn?

Có thuật toán nào phải sử dụng một trong số chúng khi thực hiện không?

Tôi thấy một câu hỏi trước đó đã chạm vào vấn đề này nhưng tôi muốn đưa vấn đề này xa hơn một chút và thực sự là deprecatechúng. Có quá nhiều cạm bẫy và cạm bẫy và cảnh giác với chúng đã được giải quyết với các cơ sở mới. Tôi chỉ cảm thấy có thể sớm đến lúc đánh dấu chúng lỗi thời.


4
Bạn đã đọc Đồng thời Java của Brian Goetz trong thực tế chưa? Ông bao gồm các cuộc tranh luận về khóa rõ ràng và khóa rõ ràng độc đáo ở đó.
Martijn Verburg

@MartijnVerburg - Đáng buồn là không nhưng tôi rất tôn trọng công việc của anh ấy.
OldCurmudgeon

1
từ khóa được đồng bộ hóa có thể hữu ích với các phương thức tĩnh đơn giản nên là luồng an toàn, cho bất cứ điều gì khác tôi sẽ sử dụng đồng thời. Nhưng đây là ý kiến ​​của tôi
Kemoda

Câu trả lời:


11

Có thuật toán nào phải sử dụng một trong số chúng khi thực hiện không?

Hầu như chắc chắn là không. (Trên thực tế, từ góc độ lý thuyết, bạn sẽ có thể chờ đợi mô phỏng / thông báo sử dụng java.util.concurrent khác. . Lớp học. Và đồng bộ có thể được thay thế bằng các hoạt động Khóa rõ ràng ... mặc dù bạn sẽ cần phải cẩn thận để mở khóa trong finallyđiều khoản.)

Tuy nhiên, có thể có các thuật toán trong đó việc triển khai thực hiện tốt nhất trong Java liên quan đến việc sử dụng trực tiếp đồng bộ hóa, có hoặc không chờ đợi và thông báo.


Đã đến lúc không đồng bộ, chờ đợi và thông báo?

Bất kể câu trả lời cho câu hỏi trước, câu trả lời chắc chắn là không.

Chờ / thông báo có thể (và thường được) sử dụng đúng. Trong Java, khấu hao được dành riêng cho các lớp và phương thức bị hỏng; tức là nơi tiếp tục sử dụng nên được sửa chữa là một vấn đề cấp bách. Nếu Sun (và bây giờ là Oracle) không chấp nhận một cái gì đó là cơ bản và được sử dụng rộng rãi như chờ đợi / thông báo, thì họ sẽ tạo ra một vấn đề tương thích nghiêm trọng đối với số lượng lớn mã kế thừa. Đó không phải là lợi ích của bất cứ ai.

Nếu bạn muốn loại bỏ đồng bộ hóa / chờ đợi / thông báo trong mã của mình, điều đó là tốt. Nhưng sự phản đối đòi hỏi phải viết lại một lượng lớn mã đa luồng về cơ bản chính xác và đó sẽ là BAD IDEA. Các nhà quản lý CNTT doanh nghiệp và các nhà quản lý sản phẩm phần mềm sẽ ghét bạn vì đã gợi ý nó ...


Thật đáng để đọc "deprecated" nghĩa là gì theo tài liệu Java: http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

Và cũng lưu ý rằng chúng ta đang nói về những thứ không dùng đến cốt lõi của ngôn ngữ Java. Khấu hao synchronizedcó hậu quả rất lớn.


Trên thực tế, theo như tôi nhớ, theo tài liệu đồng thời Java Java xuất sắc trong cuốn sách thực hành, các java.util.concurrentlớp sử dụng thực sự nhanh hơn. Đằng sau hậu trường, các lớp này nói chuyện trực tiếp với VM, khi mà đồng bộ hóa cài đặt khóa cùn trên đối tượng trong biểu đồ đối tượng và do đó ảnh hưởng đến hiệu suất toàn cầu.
akuhn

Hãy tha thứ cho tôi @Stephen nếu tôi đi qua như đề nghị rằng chúng tôi thực sự loại bỏ synchronizedet. al. Tôi chỉ đề xuất sự phản đối, mà thực sự chỉ nói không sử dụng điều này cho mã mới. Tôi sẽ không mơ ước đề xuất thiệt hại đã thử và kiểm tra mã di sản mà tôi yêu cầu loại bỏ.
OldCurmudgeon

@OldCurmudgeon - thay vì phản hồi muộn, nhưng tôi nghĩ sự phản đối là quá cực đoan. 1) Điều đó có nghĩa là tính năng này thể bị xóa. 2) Nó ngụ ý rằng tính năng này bị hỏng, khác với việc chỉ đơn thuần là lỗi thời. 3) Rất nhiều người vẫn vui vẻ viết mã mới theo cách đó ... và không có lý do mạnh mẽ nào mà họ không nên làm. 4) Có những cách khác, ít "vào mặt bạn" để ngăn cản nó; ví dụ: viết các quy tắc PMD ...
Stephen C

@StephenC - Sau đó, có một hành động ít kịch tính hơn mà chúng ta có thể thực hiện mà cuối cùng sẽ dẫn đến việc chúng không được sử dụng hoặc dạy trong trường đại học. Họ rõ ràng nên tránh. Tôi nghi ngờ các quy tắc PMD - mặc dù một ý tưởng tốt - sẽ không đến được với các giáo viên rất nhanh.
OldCurmudgeon

1
@StephenC Một nitpick: đi theo các tài liệu Java mà bạn đã liên kết đến, tôi không nghĩ sự phản đối có nghĩa là mã không dùng nữa bị hỏng. Đó là một lý do, nhưng như các tài liệu nói, một API có thể không được chấp nhận khi nó được thay thế bởi một API mới hơn, tốt hơn (như OP lập luận, là trường hợp đồng thời). Và đồng thời ở mức độ thấp, nếu không thực sự khuyến khích các thực tiễn xấu, chắc chắn rất dễ bị lỗi.
Andres F.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.