今天在想多进程、甚至多机共享内存的问题。我们知道数据库可以搭建共享存储来实现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
-----------------------------------------------如有错误请指正------------------------------