zsh_root
2025-12-10 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package home;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import javax.swing.JOptionPane;
 
public class SingleInstanceLock {
    private static final String LOCK_FILE = System.getProperty("user.home") + 
                                           File.separator + ".myapp.lock";
    private static FileLock lock;
    private static FileChannel channel;
    
    /**
     * 尝试获取应用程序锁
     * @return true-成功获取锁(第一次运行), false-获取失败(已有实例运行)
     */
    @SuppressWarnings("resource")
    public static boolean lock() {
        try {
            // 创建文件对象
            File file = new File(LOCK_FILE);
            
            // 如果文件存在但无法删除,可能是其他实例正在运行
            if (file.exists() && !file.delete()) {
                return false;
            }
            
            // 创建文件并获取通道
            RandomAccessFile raf = new RandomAccessFile(file, "rw");
            channel = raf.getChannel();
            
            // 尝试获取独占锁
            lock = channel.tryLock();
            
            // 如果获取到锁,返回true
            return lock != null;
        } catch (IOException e) {
            // 发生异常说明可能已有实例运行
            return false;
        }
    }
    
    /**
     * 释放应用程序锁
     */
    public static void release() {
        try {
            // 释放锁
            if (lock != null && lock.isValid()) {
                lock.release();
            }
            // 关闭通道
            if (channel != null && channel.isOpen()) {
                channel.close();
            }
            // 删除锁文件
            File file = new File(LOCK_FILE);
            if (file.exists()) {
                file.delete();
            }
        } catch (IOException e) {
            // 释放锁时忽略异常
        }
    }
    
    /**
     * 检查程序是否已在运行并显示警告
     */
    public static void showAlreadyRunningWarning() {
        JOptionPane.showMessageDialog(null,
            "程序已经打开,请勿重复打开",
            "警告",
            JOptionPane.WARNING_MESSAGE);
    }
}