2010-07-07 37 views
17

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

7

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ụ

+0

bạn sẽ nhận được quyền truy cập độc quyền vào một tệp như thế nào? –

+0

Hãy giải thích điều này: http://forums.sun.com/thread.jspa?threadID=465792 –

+0

http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileLock .html –

4

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.

+0

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ó? –

+0

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

+6

Đó 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

0

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.

2

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.

-1

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ử.

+1

Đó 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

+1

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

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