什么指示Eclipse应用程序工作区是否已锁定/正在使用?

什么指示Eclipse应用程序工作区是否已锁定/正在使用?,eclipse,eclipse-plugin,Eclipse,Eclipse Plugin,当我第一次启动Eclipse应用程序(使用自定义插件)时,在workspace文件夹.metadata中创建了一个.lock文件。 如果我尝试启动第二个应用程序,我会收到正确的错误消息“工作区无法锁定”。.lock文件阻止我使用同一工作区启动多个应用程序 如果我在应用程序运行时手动删除.lock文件,然后尝试启动第二个文件,它就会工作。这没关系,因为我手动删除了阻止我这样做的文件 奇怪的是: 当我关闭应用程序时,.lock文件并没有被删除,但我仍然可以启动另一个Eclipse应用程序,这样它就不

当我第一次启动Eclipse应用程序(使用自定义插件)时,在workspace文件夹.metadata中创建了一个.lock文件。 如果我尝试启动第二个应用程序,我会收到正确的错误消息“工作区无法锁定”。.lock文件阻止我使用同一工作区启动多个应用程序

如果我在应用程序运行时手动删除.lock文件,然后尝试启动第二个文件,它就会工作。这没关系,因为我手动删除了阻止我这样做的文件

奇怪的是:

当我关闭应用程序时,.lock文件并没有被删除,但我仍然可以启动另一个Eclipse应用程序,这样它就不再关心.lock文件了

为什么在应用程序关闭后.lock文件没有被删除?它如何知道工作区没有被使用


如何手动检查工作区是否正在使用?.lock文件显然不是一个安全的指示器。

我对锁文件机制的理解是:

  • 在Eclipse实例中打开工作区时,Eclipse首先检查是否存在锁文件。如果存在一个,它将尝试删除它。
    • 成功删除锁文件表明当前运行的Eclipse实例没有使用该工作区,因此该实例可以继续运行;它创建一个新的锁文件,在该实例运行时保持打开状态
    • 未能删除锁文件表明Eclipse的某个实例当前正在使用该工作区运行;由于另一个实例仍然“打开”文件,因此新实例无法删除该文件
  • 在正常关机时,Eclipse会释放该文件,但不一定会删除它。因此,以后的Eclipse实例可以在启动时自由删除它
  • 如果Eclipse崩溃或没有正常关闭,锁文件也会被释放(因为保存它的Eclipse进程被终止),再次允许以后的实例在启动时删除它

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\u JavaNio

中,这是原始行为,如果
osgi.locking
设置为
java.io
,则仍将使用。当前的默认设置是使用
java.nio
进行锁定,正如我在回答中所描述的那样。