<center id="qkqgy"><optgroup id="qkqgy"></optgroup></center>
  • <menu id="qkqgy"></menu>
    <nav id="qkqgy"></nav>
    <xmp id="qkqgy"><nav id="qkqgy"></nav>
  • <xmp id="qkqgy"><menu id="qkqgy"></menu>
    <menu id="qkqgy"><menu id="qkqgy"></menu></menu>
    <tt id="qkqgy"><tt id="qkqgy"></tt></tt>

  • ? ?
    JDK1.4里面的MappedByteBuffer為開發人員在java中實現共享內存提供了良好的方法,該緩沖區實際上是一個磁盤文件的內存映像,二者的變化會保持同步,即內存數據發生變化過后會立即反應到磁盤文件中,這樣會有效的保證共享內存的實現,將共享文件和磁盤文件建立聯系的是文件通道類:FileChannel,該類的加入是JDK為了統一外圍設備的訪問方法,并且加強了多線程對同一個文件進行存取的安全性,這里可以使用它來建立共享內存用,它建立了共享內存和磁盤文件之間的一個通道。打開一個文件可使用RandomAccessFile類的getChannel方法,該方法直接放回一個文件通道,該文件通道由于對應的文件設為隨機存取,一方面可以進行讀寫兩種操作,另一方面使用它不會破壞共享文件的內。這里,如果使用FileOutputStream和FileOutputStream則不能理想的實現共享內存的要求,因為這兩個類同時實現自由讀寫很困難。

    ? ? 下邊的代碼實現了上邊提及的共享內存功能
    // 獲得一個只讀的隨機存取文件對象 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); // 獲取頭部消息:存取權限
    int mode = mapBuf.getInt();

    ? ? 如果多個應用映像使用同一文件名的共享內存,則意味著這多個應用共享了同一內存數據,

    這些應用對于文件可以具有同等存取權限,一個應用對數據的刷新會更新到多個應用中。為了防止多個應用同時對共享內存進行讀寫操作,可以在該共享內存的頭部信息加入寫操作標記,該共享內存的頭部信息至少有:共享內存的長度,共享內存目前的存取模式。共享內存的頭部信息是私有信息,多個應用可以對同一個共享內存執行寫操作,執行寫操作和結束寫操作的時候,可以使用如下方法:
    public boolean startWrite(){ if(mode == 0){ ?//存儲模式是0,表示可寫 mode = 1;
    ?//意味著別的應用不可寫 mapBuf.flip(); mapBuf.putInt(mode); ?//寫入共享內存的頭部信息 return true; }
    else{ //表明已經有應用在寫該共享內存了,本應用不能夠針對共享內存再做寫操作 return false;? } } public boolean
    stopWrite(){ mode = 0; ?//釋放寫權限 mapBuf.flip(); mapBuf.putInt(mode);
    ?//寫入共享內存頭部信息 return true; }
    ? ? 上邊提供了對共享內存執行寫操作過程的兩個方法,這兩個方法其實理解起來很容易,真正

    需要思考的事一個針對存取模式的設置,其實這種機制和內存的鎖模式有點類似,一旦當mode設置為可寫的時候,startWrite才能返回true,不僅僅如此,某個應用程序在向共享內存寫入數據的時候還是會修改其存取模式,因為如果不修改的話就會導致其他應用同樣針對該內存是可寫的,這樣就導致共享內存的實現變得混亂,而在停止寫操作stopWrite的時候,需要將mode設置為0,也就是上邊注釋段提到的釋放寫權限。

    ? ? java中共享內存的應用:
    ? ? 1、永久對象的配置
    ? ? 2、共享數據的查詢

    ?

    技術
    下載桌面版
    GitHub
    百度網盤(提取碼:draw)
    Gitee
    云服務器優惠
    阿里云優惠券
    騰訊云優惠券
    華為云優惠券
    站點信息
    問題反饋
    郵箱:ixiaoyang8@qq.com
    QQ群:766591547
    關注微信
    巨胸美乳无码人妻视频