科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道JAVA基础:共享内存在Java中的实现和应用2

JAVA基础:共享内存在Java中的实现和应用2

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 共享内存的头部信息是类的私有信息,在多个应用可以对同一共享内存执行写操作时,开始执行写操作和结束写操作时,需调用如下方法:}这里提供的类文件mmap.java封装了共享内存的基本接口,读者可以用该类扩展成自己需要的功能全面的类。

作者:郭洪锋 来源:IT专家网 2008年5月9日

关键字: 实现 内存 共享 java

  • 评论
  • 分享微博
  • 分享邮件
共享内存的头部信息是类的私有信息,在多个应用可以对同一共享内存执行写操作时,开始执行写操作和结束写操作时,需调用如下方法:  
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 lockfc = fis.getChannel();
  // 获得文件的独占锁,该方法不产生堵塞,立刻返回
  FileLock flock = lockfc.tryLock();
  // 如果为空,则表明已经有应用占有该锁
  if(flock == null) {
  ...// 不能执行写操作
  }
  else {
  ...// 可以执行写操作
  }
  该锁会在应用异常退出后自动释放,这正是该处所需要的方法。

  3 共享内存在java中的应用

  共享内存在java应用中,经常有如下两种种应用:

  永久对象配置。

  在java服务器应用中,用户可能会在运行过程中配置一些参数,而这些参数需要永久有效,当服务器应用重新启动后,这些配置参数仍然可以对应用起作用。这就可以用到该文中的共享内存。该共享内存中保存了服务器的运行参数和一些对象运行特性。可以在应用启动时读入以启用以前配置的参数。

  查询共享数据。

  一个应用(例 sys.java)是系统的服务进程,其系统的运行状态记录在共享内存中,其中运行状态可能是不断变化的。为了随时了解系统的运行状态,启动另一个应用(例 mon.java),该应用查询该共享内存,汇报系统的运行状态。

  可见,共享内存在java应用中还是很有用的,只要组织好共享内存的数据结构,共享内存就可以在应用开发中发挥很不错的作用。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章