关于Java共享内存


今天在想多进程、甚至多机共享内存的问题。我们知道数据库可以搭建共享存储来实现XXX。进程间可以通过Unix域来通信【性能和127.0.0.1差别不大,前提Linux内核,Windows不清楚】。Java可以通过MappedByteBuffer实现数据共享。

但是这篇文章,我们讨论的是如何通过Unsafe实现数据共享数据【暂没有找到好办法】。

贴下MappedByteBuffer数据共享代码

public class MemMap1 {
    public static void main(String[] args) throws IOException, InterruptedException {
        File file = new File("/tmp/map.txt");
        if(!file.exists()) {
            file.createNewFile();
        }

        RandomAccessFile memoryMappedFile = new RandomAccessFile(file, "rw");
        MappedByteBuffer buffer = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 100);

        buffer.putLong(123);
        buffer.putLong(456);
        buffer.putLong(789);

        Thread.sleep(20000);

        memoryMappedFile.close();
    }
}
public class MemMap2 {

    public static void main(String[] args) throws IOException, InterruptedException {
        File file = new File("/tmp/map.txt");
        if(!file.exists()) {
            return;
        }

        RandomAccessFile memoryMappedFile = new RandomAccessFile(file, "rw");
        MappedByteBuffer buffer = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 100);

        System.out.println(buffer.getLong());
        System.out.println(buffer.getLong());
        System.out.println(buffer.getLong());

        memoryMappedFile.close();
    }
}

MappedByteBuffer中,getXXX、putXXX也是通过Unsafe来实现的。

MemMap1调用unsafe.putLong,MemMap2调用unsafe.getLong,但是两者操作的内存地址不同【这是最关键的】,就是说,不同的进程映射同一个文件,但是内存空间却是分开的。

----------------------------------------------- 2015 08 18 更新 ------------------------------

C有直接操作共享内存的库 sys/shm.h

在我的Gist中有例子:

https://gist.github.com/liuxinglanyue/cbafc29c120ccdd04924

-----------------------------------------------如有错误请指正------------------------------


上篇: 如何做一个。。。。 下篇: 纪念下为知,第888篇