- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
共享内存在Java中的实现和应用.doc
基于Java平台共享内存的实现与应用
(张华杰 郑州广播电视大学 河南 郑州 450007 )
【摘要】:
在java 开发环境中,没有涉及共享内存这个概念,但是在某一些应用中,“共享内存”确实非常有用。在java语言的分布式应用系统中,存在着大量的分布式共享对象,很多时候需要查询这些对象的状态,如果采用网络通信的方式,会增加应用的额外负担;如果采用共享内存的方式,则可以直接通过共享内存查看对象的状态数据和统计数据,减少了一些不必要的麻烦。
【关键字】:共享内存、java
一、 共享内存对应用开发的意义:
IPC(InterProcess Communication)基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中共享内存IPC机制的关键,对于数据共享、系统快 速查询、动态配置、减少资源耗费等均有独到的优点。对应UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种,而对应 Windows,实际上只有映像文件共享内存一种。所以java应用中也是只能创建映像文件共享 内存。
二、 共享内存在java中的实现
在jdk中提供的类MappedByteBuffer为我们实现共享内存提供了较好的方法。该缓冲区实际上是一个磁盘文件的内存映像。二者的变化将保持同步,即内存数据发生变化会立刻反映到磁盘文件中,这样会有效的保证共享内存的实现。将共享内存和磁盘文件建立联系的是文件通道类:FileChannel。该类的加入是JDK为 了统一对外部设备的访问方法,并且加强了多线程对同一文件进行存取的安全性。例如读写操作统一成read和write。这里只是用它来建立共享内存用,它建立 了共享内存和磁盘文件之间的一个通道。
打 开一个文件建立一个文件通道可以用RandomAccessFile类中的方法getChannel。该方法将直接返回一个文件通道。该文件通道由于对应的文件设为随机存取文件,一方面可以进行读写两种操作,另一方面使用它不会破坏映像文件的内容。这里如果用 FileOutputStream和FileInputStream则不能理想的实现共享内存的要求,因为这两个类同时 实现自由的读写操作要困难得多。
一下过程实现了如这种功能;
RandomAccessFile RAFile = new RandomAccessFile(filename,r);// 获得一个只读的随机存取文件对象
FileChannel 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.
您可能关注的文档
- 二〇一一年一季度运行分析.doc
- 二材料分析题.doc
- 二氧化硫性质探究学案(自编).doc
- 二级医院实施主诊医师负责制的做法和体会.doc
- 二食用油、油脂及其制品.doc
- 云南太阳能热水器建筑一体化研究概况.doc
- 云计算是一种新的世界观.doc
- 互动营销变局中的策略.doc
- 五合乡中心小学安全预防工作应急预案.doc
- 五年制高职教育的展望.doc
- 聚焦2025:工业互联网平台IPv6升级,工业互联网平台商业模式创新报告.docx
- 聚焦2025:家庭教育指导服务市场趋势与消费者行为研究报告.docx
- 聚焦2025:家庭教育指导服务市场需求现状及增长趋势分析报告.docx
- 聚焦2025:小微企业创业扶持资金申请流程优化报告.docx
- 聚焦2025:家电制造行业出口竞争力提升与海外市场拓展策略分析.docx
- 聚焦2025:妇幼保健服务体系建设与老年人健康管理.docx
- 聚焦2025:天然气勘探开发技术创新与市场竞争力分析报告.docx
- 聚焦2025:工业互联网平台光通信技术升级策略及行业应用研究.docx
- 聚焦2025:工业互联网平台光通信技术升级产业链分析报告.docx
- 个人新增合伙人协议书(二).docx
文档评论(0)