我正在重新编写一个可执行多次的Java可执行文件,并且我希望该过程一次执行一个。在C#中,我会用named/system Mutex来做到这一点,但这在Java中似乎不可行。我怎样才能实现这个功能?在Java中获得独占系统范围的锁
回答
您可以使用对文件系统上文件的独占访问来实现类似的行为。我不认为有类似于你所提到的东西。
例子
每次启动Java可执行文件,启动Java虚拟机(JVM)的新实例。他们就像一个不同的工作站。这就是为什么在Java中没有像系统互斥那样的东西。
我知道它们处于不同的运行时/进程中,但许多(大多数?)操作系统提供了系统互斥功能。 Java没有办法访问它吗? – 2010-07-07 12:51:00
问题是互斥锁是一个同步工具。如果您编写本机应用程序,则可以使用互斥锁来同步单台计算机边界中的线程(或进程)。 但是,如果你编写一个Java应用程序,比你的静音是java.lang.Object。它有等待/通知方法,但它们仅在单个机器(JVM)的边界内才有意义。 举例:在Google App Engine上托管Java云。它按需创建新的JVM。程序员不知道新的JVM是在同一个主机上还是在集群的另一个节点上创建的。 – Antonio 2010-07-07 14:03:51
这就是例如.NET应用程序 - 但它们确实命名了互斥体。简短的故事是,Java没有。 – nos 2010-07-07 16:22:27
如果您的操作系统提供这些互斥锁,也许您可以使用本机库? (http://en.wikipedia.org/wiki/Java_Native_Interface)当然,您将以操作系统特定的方式访问此资源,因此您将失去纯Java提供的可移植性。
Java是最不常见的分母工具,它提供了所有运行平台都通用的功能,也就是说它已经实现了。
You could use JNA(一种简化的访问本地功能的方法)
在过去,我使用套接字来确保程序在启动时无法启动。
正如其他地方所指出的基于文件的信号量可以工作,当然这是一个缺点,如果程序崩溃,那么你的信号量必须手动重置。
请记住,Java运行在Java虚拟机下。与操作系统级别的同步机制通常只会影响其运行的机器一样,本机Java同步机制也只能在该JVM中运行。
试图阻止启动多个JVM来执行某些操作与尝试阻止应用程序在多个物理机器上同时运行类似,这可能不值得。
- 1. 系统分析中的系统范围
- 2. MySQL:独占锁
- 3. 在java中的范围锁定
- 4. Java系统代理属性范围
- 5. Java - 锁定独占访问的文件
- 6. NHibernate:独占锁定
- 7. Socat对PTY的独占锁
- 8. 如何在(-1,1)范围内独占而不是包含范围内的数据
- 9. 系统范围I/O统计
- 10. 系统未在范围内声明?
- 11. SQL Server 2000独占锁定
- 12. 插入独占锁定
- 13. SQLite非独占RESERVED锁?
- 14. 如何在Windows中获取进程独占锁定文件夹?
- 15. ES6类和模块系统的范围
- 16. 系统范围的RVM安装问题
- 17. 如何设置系统范围的umask?
- 18. 管理系统范围的参数C
- 19. 我想从java获得系统keyEvent
- 20. 的Java获得监测锁
- 21. 如何获得指定页面的范围从Java中的pdf?
- 22. 系统参数超出范围例外
- 23. 模板系统范围问题
- 24. 共享数据系统范围
- 25. reactJS禁用console.log系统范围
- 26. 如何创建系统范围变量?
- 27. CakePHP系统范围搜索功能
- 28. windows c webserver上的独占锁文件
- 29. Oracle 10g上的独占表(读)锁?
- 30. F#的共享独占锁实现
你将如何去独占访问文件? – 2010-07-07 14:54:50
小鸡出来:http://forums.sun.com/thread.jspa?threadID=465792 – 2010-07-07 15:00:42
http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileLock .html – 2010-07-07 15:01:40