「java共享内存」java共享内存使用场景
本篇文章给大家谈谈java共享内存,以及java共享内存使用场景对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Java中MappedByteBuffer共享内存的问题,如何将一个Map共享?求解
- 2、java可以和c++共享内存文件吗
- 3、java 多进程并发控制怎么做?
- 4、大师们,JNI能让Java和C/C++共享内存吗
Java中MappedByteBuffer共享内存的问题,如何将一个Map共享?求解
我找到的办法是使用MappedByteBuffer的方法映射一个文件,实现内存共享。
引用集群两大功能负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图(信息上下文)必须是一样的。如果这部分资源不可用的话,集群就不能体现它错误恢复的强大关键功能。
========分割线==============
如果非要共享,我想也可以利用集群中的两大技术之一“内部通信”来实现共享访问。但关于这方面的资料甚少。这部分共享数据只用来高速只读访问,挂的可能性不大。
lovewhzlq 写道现在关于分布式缓存的应用一般都采用memcached(分布式内存缓存系统),
不过客户端连接memcached还是基于socket,
不过你可是以把memcached和tomcat应用都放在一台服务器上,通信应该比较快在同一台机器上试过了,速度不理想。说白了我内存中有一个巨大数组,每次用户访问需要从数组中取几千次数据,并且不连续,基于socket的方式似乎不适合我。
java可以和c++共享内存文件吗
当然是可以共享的。
你可以在自己的电脑上同时安装C++和java,然后让他们分别运行自己的项目就知道了。
他们是可以一起运行的。
java 多进程并发控制怎么做?
进程间的通讯无非就是读写文件,socket通讯或者使用共享内存。 你不想用读写文件的方式,那就用共享内存或者socket通讯的方式。我个人觉得用socket比较简单,也许是因为我对socket比较熟悉。 下面是一篇java实现共享内存的文章,java没法管理内存,其实他也是靠创建映像文件来实现的。 共享内存在java中的实现 在jdk1.4中提供的类MappedByteBuffer为我们实现共享内存提供了较好的方法。该缓冲区实际上是一个磁盘文件的内存映像。二者的变化将保持同步,即内存数据发生变化会立刻反映到磁盘文件中,这样会有效的保证共享内存的实现。 将共享内存和磁盘文件建立联系的是文件通道类:FileChannel。该类的加入是JDK为了统一对外部设备(文件、网络接口等)的访问方法,并且加强了多线程对同一文件进行存取的安全性。例如读写操作统一成read和write。这里只是用它来建立共享内存用,它建立了共享内存和磁盘文件之间的一个通道。 打开一个文件建立一个文件通道可以用RandomAccessFile类中的方法getChannel。该方法将直接返回一个文件通道。该文件通道由于对应的文件设为随机存取文件,一方面可以进行读写两种操作,另一方面使用它不会破坏映像文件的内容(如果用FileOutputStream直接打开一个映像文件会将该文件的大小置为0,当然数据会全部丢失)。这里,如果用 FileOutputStream和FileInputStream则不能理想的实现共享内存的要求,因为这两个类同时实现自由的读写操作要困难得多。 下面的代码实现了如上功能,它的作用类似UNIX系统中的mmap函数。 // 获得一个只读的随机存取文件对象 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.putInt(mode);
大师们,JNI能让Java和C/C++共享内存吗
JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。
很多时候,某些功能用Java无法实现,比如说涉及到底层驱动的一些功能,这时候我们就可以利用JNI来调用C或者C++程序来实现,这就是JNI的强大之处。
但是JNI也有它的缺点,使用java与本地已编译的代码交互,通常会丧失平台可移植性。
java共享内存的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java共享内存使用场景、java共享内存的信息别忘了在本站进行查找喔。
发布于:2022-12-27,除非注明,否则均为
原创文章,转载请注明出处。