跨进程同步锁的实现方法:

1. C++ named mutex

2. 文件是全系统通用的,可以通过文件锁来实现变相的跨进程锁

一个 java 例子:

ProgramA

复制代码
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class ProgramA {

    public static void main(String[] args) throws IOException {
        
        RandomAccessFile randomAccessFile = new RandomAccessFile("884e94ae-e524-4c73-9200-3df9bec9f6af", "rw");
        FileChannel fileChannel = randomAccessFile.getChannel();
        FileLock fileLock = null;
        
        try
        {
            fileLock = fileChannel.lock();
            
            System.out.println("A已获取锁");
            
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            reader.readLine();
        }
        finally
        {
            fileLock.release();
            System.out.println("A已释放锁");
        }
    }
}
复制代码

 

ProgramB:

复制代码
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class ProgramB {

    public static void main(String[] args) throws IOException {
        RandomAccessFile randomAccessFile = new RandomAccessFile("884e94ae-e524-4c73-9200-3df9bec9f6af", "rw");
        FileChannel fileChannel = randomAccessFile.getChannel();
        FileLock fileLock = null;
        
        try
        {
            System.out.println("B正在获取锁");
            fileLock = fileChannel.lock();
            System.out.println("B已获取锁");
            
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            reader.readLine();
        }
        finally
        {
            fileLock.release();
            System.out.println("B已释放锁");
        }
    }

}
复制代码

 

其实还可以这样实现:

复制代码
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class CrossProcessLocker implements AutoCloseable {

    private String id = null;
    private FileLock fileLock = null;
    
    @SuppressWarnings("resource")
    public CrossProcessLocker(String id) throws IOException {
        this.id = id;
        RandomAccessFile randomAccessFile = new RandomAccessFile(id, "rw");
        FileChannel fileChannel = randomAccessFile.getChannel();
        fileLock = fileChannel.lock();
    }
    
    @Override
    public void close() throws Exception {
        fileLock.release();
    }
    
}
复制代码
复制代码
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class ProgramA {

    public static void main(String[] args) throws Exception {
        
        System.out.println("A正在获取锁");
        try(CrossProcessLocker cpl = new CrossProcessLocker("884e94ae-e524-4c73-9200-3df9bec9f6af"))
        {
            System.out.println("A已获取锁");
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            reader.readLine();
        }
        
        System.out.println("A已释放锁");
    }
}
复制代码
复制代码
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.util.Timer;
import java.util.TimerTask;

public class ProgramB {

    public static void main(String[] args) throws Exception {
        
        System.out.println("B正在获取锁");
        try(CrossProcessLocker cpl = new CrossProcessLocker("884e94ae-e524-4c73-9200-3df9bec9f6af"))
        {
            System.out.println("B已获取锁");
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            reader.readLine();
        }
        
        System.out.println("B已释放锁");
    }

}
复制代码

 

posted on   空明流光  阅读(264)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示