Tôi đang làm việc lại một tệp thực thi Java có thể được bắt đầu nhiều lần và tôi muốn quá trình này thực hiện một lần tại một thời điểm. Trong C# tôi sẽ làm điều này với một tên/hệ thống Mutex, nhưng điều này dường như không thể có trong Java. Làm thế nào tôi có thể đạt được chức năng này?Lấy khóa toàn hệ thống độc quyền trong Java
Trả lời
Bạn có thể sử dụng quyền truy cập độc quyền vào Tệp trên Hệ thống tệp để đạt được hành vi tương tự. Tôi không nghĩ rằng có một cái gì đó tương tự như những gì bạn đã đề cập.
Ví dụ
Mỗi khi bạn khởi động Java thực thi, bạn bắt đầu một trường hợp mới của Java Virtual Machine (JVM). Họ giống như một máy trạm khác nhau. Đó là lý do tại sao không có một thứ như hệ thống mutex trong Java.
Tôi hiểu rằng chúng nằm trong các thời gian/quy trình khác nhau, nhưng nhiều hệ điều hành (nhất?) cung cấp tính năng mutex hệ thống. Liệu Java không có cách nào để truy cập nó? –
Vấn đề là Mutex là một công cụ đồng bộ hóa. Nếu bạn viết một ứng dụng gốc, các mutex có thể được sử dụng để đồng bộ hóa các luồng (hoặc các tiến trình) trong giới hạn của một máy đơn lẻ. Nhưng nếu bạn viết một ứng dụng Java, thì mutes của bạn là java.lang.Object. Nó có các phương thức chờ/thông báo, nhưng chúng chỉ có ý nghĩa trong giới hạn của một máy đơn lẻ (JVM). Ví dụ: Lưu trữ đám mây Java tại Google App Engine. Nó tạo ra các JVM mới theo yêu cầu. Lập trình viên không biết nếu một JVM mới được tạo ra tại cùng một máy chủ hoặc tại một nút khác của cụm. – Antonio
Đó là cùng một câu chuyện cho ví dụ: Các ứng dụng .NET - tuy nhiên chúng có tên mutexes. Truyện ngắn là, Java thì không. – nos
Nếu hệ điều hành của bạn cung cấp các mutex này, có lẽ bạn có thể thực hiện với thư viện gốc? (http://en.wikipedia.org/wiki/Java_Native_Interface) Tất nhiên, bạn sẽ truy cập vào tài nguyên này theo cách cụ thể cho hệ điều hành, vì vậy bạn sẽ mất khả năng di động mà Java thuần túy cung cấp cho bạn.
Java là một công cụ mẫu số ít phổ biến nhất cung cấp chức năng phổ biến cho tất cả các nền tảng mà nó chạy trên đó, đó là nếu nó đã được triển khai chưa.
You could use JNA (Cách đơn giản để truy cập chức năng gốc)
Trước đây tôi đã sử dụng ổ cắm để đảm bảo rằng chương trình không thể khởi động nếu chương trình đang chạy.
Như được chỉ ra ở nơi khác, tệp dựa trên Semaphore có thể hoạt động, tất nhiên một nhược điểm của điều này là nếu chương trình bị treo thì semaphore của bạn phải được đặt lại theo cách thủ công.
Hãy nhớ rằng Java chạy dưới Máy ảo Java. Giống như các cơ chế đồng bộ hóa ở mức OS thường chỉ ảnh hưởng đến máy mà nó chạy, các cơ chế đồng bộ hóa Java nguyên gốc chỉ hoạt động trong JVM đó.
Cố gắng ngăn không cho nhiều JVM được khởi chạy để thực hiện điều gì đó tương tự như cố gắng ngăn ứng dụng chạy đồng thời trên nhiều máy vật lý và có lẽ không đáng để thử.
Đó chỉ là chính xác đối với các ứng dụng phía máy chủ. Nhiều ứng dụng GUI phía máy khách chỉ yêu cầu một phiên bản để chạy tại một thời điểm và không có cách nào xung quanh. – Dennis
Anh ấy sẽ không hỏi liệu nó sẽ không đáng giá ... Bạn có thể không thể ngăn chặn việc bắt đầu nhiều jvm nhưng ai quan tâm đến điều đó? Điều quan trọng là đặt khóa này ở điểm sớm nhất trong chương trình để nó có thể đợi/hủy bỏ nếu các tiến trình khác đang chạy. – jontejj
- 1. NHibernate: khóa độc quyền
- 2. cách sử dụng MS Office với hệ thống tài liệu back-end java độc quyền
- 3. cách an toàn nhất để lấy Hệ thống lái
- 4. Từ khóa cho độc quyền hoặc trong ruby?
- 5. Hibernate + PostgreSQL: Tải Lười Biếng với Ổ Khóa Độc Quyền
- 6. Ứng dụng độc lập Java trong hệ thống n mà không cần cài đặt thủ công?
- 7. Hệ thống tài nguyên độc lập nền tảng (như hệ thống tài nguyên Qt)
- 8. Hệ thống phân phối Java
- 9. Một OR độc quyền bit làm gì trong Java?
- 10. Nhận hệ thống phân cấp cuộc gọi trong java
- 11. Âm thanh hệ thống trong Java
- 12. Khung kiểm tra hệ thống trong Java
- 13. Hệ thống bỏ phiếu Java
- 14. Cần hệ thống tra cứu khóa-giá trị phân phối
- 15. Hệ thống Tìm/Thay thế Độc đáo Không Hoạt động
- 16. hệ thống đăng nhập PHP an toàn?
- 17. Cách lấy ngôn ngữ hệ thống và ngôn ngữ hệ thống trong ca cao
- 18. Java - Cách nhận ngày hiện tại độc lập với ngày hệ thống?
- 19. Cách lấy Màu Hệ thống Android
- 20. Lấy kích thước hệ thống RAM
- 21. Delphi 2007 - Phím nóng toàn hệ thống KHÔNG phải là "toàn hệ thống" nếu thiết lập "MainFormOnTaskBar: = True"
- 22. Khóa tệp độc lập trên nền tảng?
- 23. Cách lấy thời gian hệ thống trong Java mà không cần tạo một Date mới
- 24. Làm thế nào để lấy thông tin hệ thống hữu ích trong java?
- 25. FileSystemWatcher vượt qua quyền của hệ thống tệp
- 26. Lấy khoảng cách nút (bước nhảy) trong hệ thống NUMA
- 27. Java - lấy chỉ mục khóa trong HashMap?
- 28. API độc lập với hệ điều hành để giám sát hệ thống tệp?
- 29. Android: Công cụ hệ thống: Hiển thị cảnh báo cấp hệ thống: Cách sử dụng quyền này?
- 30. Biến môi trường hệ thống Java
bạn sẽ nhận được quyền truy cập độc quyền vào một tệp như thế nào? –
Hãy giải thích điều này: http://forums.sun.com/thread.jspa?threadID=465792 –
http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileLock .html –