内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
以下程序同时运行,遇到0时写1,遇到1时写0 的次数。。最后可以看到打印的结果
,写1的次数跟写0的次数。
package org.yzy; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode; import java.nio.channels.FileLock; /** * 往 "共享内存" 写入数据 * */ public class WriteShareMemory { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { RandomAccessFile raf = new RandomAccessFile("swap.mm", "rw"); FileChannel fc = raf.getChannel(); MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 1024); int writeOne = 0; int writeZero = 0; int i = 0; try { while (i < 200) { i++; FileLock lock = null; try { lock = fc.lock(); if (lock != null) { int v = mbb.getInt(0); if (v == 0) { mbb.putInt(0, 1); writeOne++; } else { mbb.putInt(0, 0); writeZero++; } }else{ System.out.println("lock is null"); } } finally { if (lock != null) { lock.release(); } } try { Thread.sleep(100l); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } fc.close(); raf.close(); System.out.println("######writeOne:" + writeOne + ",writeZero:" + writeZero); } }