当前位置: 网学 > 编程文档 > JAVA > 正文

使用技巧:共享内存在Java中实现和应用

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/16
下载{$ArticleTitle}原创论文样式
el fc = RAFile.getChannel(); 

  // 取得文件的实际大小,以便映像到共享内存 

  int size = (int)fc.size(); 

  // 获得共享内存缓冲区,该共享内存只读 

  MappedByteBuffer mapBuf = fc.map(FileChannel.MAP_RO,0,size); 

  // 获得一个可读写的随机存取文件对象 

  RAFile = new RandomAccessFile(filename,"rw"); 

  // 获得相应的文件通道 

  fc = RAFile.getChannel(); 

  // 取得文件的实际大小,以便映像到共享内存 

  size = (int)fc.size(); 

  // 获得共享内存缓冲区,该共享内存可读写 

  mapBuf = fc.map(FileChannel.MAP_RW,0,size); 

  // 获取头部消息:存取权限 

  mode = mapBuf.getInt(); 

  如果多个应用映像同一文件名的共享内存,则意味着这多个应用共享了同一内存数据。这些应用对于文件可以具有同等存取权限,一个应用对数据的刷新会更新到多个应用中。 

  为了防止多个应用同时对共享内存进行写操作,可以在该共享内存的头部信息加入写操作标志。该共享内存的头部基本信息至少有: 

  int Length; // 共享内存的长度。 

  int mode; // 该共享内存目前的存取模式。 

  共享内存的头部信息是类的私有信息,在多个应用可以对同一共享内存执行写操作时,开始执行写操作和结束写操作时,需调用如下方法: 

  public boolean StartWrite() 

  { 

  if(mode == 0) { // 标志为0,则表示可写 

  mode = 1; // 置标志为1,意味着别的应用不可写该共享内存 

  mapBuf.flip(); 

  mapBuf.putInt(mode); // 写如共享内存的头部信息 

  return true; 

  } 

  else { 

  return false; // 指明已经有应用在写该共享内存,本应用不可写该共享内存 

  } 

  } 

   

  public boolean StopWrite() 

  { 

  mode = 0; // 释放写权限 

  mapBuf.flip(); 

  mapBuf.putInt(mode); // 写入共享内存头部信息 

  return true; 

  } 

  这里提供的类文件mmap.java封装了共享内存的基本接口,读者可以用该类扩展成自己需要的功能全面的类。 

  如果执行写操作的应用异常中止,那么映像文件的共享内存将不再能执行写操作。为了在应用异常中止后,写操作禁止标志自动消除,必须让运行的应用获知退出的应用。在多线程应用中,可以用同步方法获得这样的效果,但是在多进程中,同步是不起作用的。方法可以采用的多种技巧,这里只是描述一可能的实现:采用文件锁的方式。写共享内存应用在获得对一个共享内存写权限的时候,除了判断头部信息的写权限标志外,还要判断一个临时的锁文件是否可以得到,如果可以得到,则即使头部信息的写权限标志为1(上述),也可以启动写权限,其实这已经表明写权限获得的应用已经异常退出,这段代码如下: 

  // 打开一个临时的文件,注意同一共享内存,该文件名要相同,可以在共享文件名后加后缀“.lock”。 

  RandomAccessFile fis = new RandomAccessFile("shm.lock","rw"); 

  // 获得文件通道 

  FileChannel l

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号