当我第一次启动Eclipse应用程序(使用我的自定义插件)时,会在工作区文件夹.metadata中创建.lock文件。 如果我尝试启动第二个应用程序,我会收到正确的错误消息" Workspace无法锁定"。 .lock文件阻止我使用相同的工作区启动多个应用程序。
如果我在应用程序运行时手动删除.lock文件,然后尝试启动第二个文件就可以了。没关系,因为我手动删除了阻止我的文件。
这是一个奇怪的部分:
当我关闭应用程序时,.lock文件没有被删除,但我仍然可以启动另一个Eclipse应用程序,因此它似乎并不关心.lock文件。
为什么在关闭应用程序后没有删除.lock文件,以及它如何知道工作区未被使用?
如何手动检查工作区是否正在使用? .lock文件显然不是一个安全的指标。
答案 0 :(得分:1)
我对锁文件机制的理解是这样的:
答案 1 :(得分:1)
Eclipse确实使用了.lock
文件,但它也获得了一个实际的“锁定”文件。在文件上。这通常使用Java FileChannel
tryLock
方法完成,该方法获取文件的操作系统级别锁定:
RandomAccessFile raFile = new RandomAccessFile(lockFile, "rw");
FileLock fileLock = raFile.getChannel().tryLock(0, 1, false);
如果文件已被另一个Eclipse锁定,tryLock
方法将抛出OverlappingFileLockException
。
当Eclipse关闭时,锁被释放,文件关闭。
没有必要删除锁定文件,因此不会这样做。
有一个环境变量osgi.locking
,可用于更改此行为。
完整代码位于org.eclipse.osgi.internal.location.Locker_JavaNio