最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡要分析Java多進程編程的并發(fā)控制

 更新時間:2015年11月05日 17:03:09   作者:dyyaries  
這篇文章介紹了簡要分析Java多進程編程的并發(fā)控制,主要針對內存獲取方面,需要的朋友可以參考下

進程間的通訊無非就是讀寫文件,socket通訊或者使用共享內存。
java沒法管理內存,其實他也是靠創(chuàng)建映像文件來實現(xiàn)的。
 共享內存在java中的實現(xiàn)
在jdk1.4中提供的類MappedByteBuffer為我們實現(xiàn)共享內存提供了較好的方法。該緩沖區(qū)實際上是一個磁盤文件的內存映像。二者的變化將保持同步,即內存數(shù)據(jù)發(fā)生變化會立刻反映到磁盤文件中,這樣會有效的保證共享內存的實現(xiàn)。

將共享內存和磁盤文件建立聯(lián)系的是文件通道類:FileChannel。該類的加入是JDK為了統(tǒng)一對外部設備(文件、網(wǎng)絡接口等)的訪問方法,并且加強了多線程對同一文件進行存取的安全性。例如讀寫操作統(tǒng)一成read和write。這里只是用它來建立共享內存用,它建立了共享內存和磁盤文件之間的一個通道。

打開一個文件建立一個文件通道可以用RandomAccessFile類中的方法getChannel。該方法將直接返回一個文件通道。該文件通道由于對應的文件設為隨機存取文件,一方面可以進行讀寫兩種操作,另一方面使用它不會破壞映像文件的內容(如果用FileOutputStream直接打開一個映像文件會將該文件的大小置為0,當然數(shù)據(jù)會全部丟失)。這里,如果用 FileOutputStream和FileInputStream則不能理想的實現(xiàn)共享內存的要求,因為這兩個類同時實現(xiàn)自由的讀寫操作要困難得多。

下面的代碼實現(xiàn)了如上功能,它的作用類似UNIX系統(tǒng)中的mmap函數(shù)。

// 獲得一個只讀的隨機存取文件對象
RandomAccessFile RAFile = new RandomAccessFile(filename,"r");
// 獲得相應的文件通道
FileChannel fc = RAFile.getChannel();
// 取得文件的實際大小,以便映像到共享內存
int size = (int)fc.size();
// 獲得共享內存緩沖區(qū),該共享內存只讀
MappedByteBuffer mapBuf = fc.map(FileChannel.MAP_RO,0,size);
// 獲得一個可讀寫的隨機存取文件對象
RAFile = new RandomAccessFile(filename,"rw");
// 獲得相應的文件通道
fc = RAFile.getChannel();
// 取得文件的實際大小,以便映像到共享內存
size = (int)fc.size();
// 獲得共享內存緩沖區(qū),該共享內存可讀寫
mapBuf = fc.map(FileChannel.MAP_RW,0,size);
// 獲取頭部消息:存取權限
mode = mapBuf.getInt();

如果多個應用映像同一文件名的共享內存,則意味著這多個應用共享了同一內存數(shù)據(jù)。這些應用對于文件可以具有同等存取權限,一個應用對數(shù)據(jù)的刷新會更新到多個應用中。
為了防止多個應用同時對共享內存進行寫操作,可以在該共享內存的頭部信息加入寫操作標志。該共享內存的頭部基本信息至少有:

int Length; // 共享內存的長度。
int mode; // 該共享內存目前的存取模式。

 
共享內存的頭部信息是類的私有信息,在多個應用可以對同一共享內存執(zhí)行寫操作時,開始執(zhí)行寫操作和結束寫操作時,需調用如下方法:

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封裝了共享內存的基本接口,讀者可以用該類擴展成自己需要的功能全面的類。
 
如果執(zhí)行寫操作的應用異常中止,那么映像文件的共享內存將不再能執(zhí)行寫操作。為了在應用異常中止后,寫操作禁止標志自動消除,必須讓運行的應用獲知退出的應用。在多線程應用中,可以用同步方法獲得這樣的效果,但是在多進程中,同步是不起作用的。方法可以采用的多種技巧,這里只是描述一可能的實現(xiàn):采用文件鎖的方式。寫共享內存應用在獲得對一個共享內存寫權限的時候,除了判斷頭部信息的寫權限標志外,還要判斷一個臨時的鎖文件是否可以得到,如果可以得到,則即使頭部信息的寫權限標志為1(上述),也可以啟動寫權限,其實這已經表明寫權限獲得的應用已經異常退出,這段代碼如下:

// 打開一個臨時的文件,注意同一共享內存,該文件名要相同,可以在共享文件名后加后綴“.lock”。
RandomAccessFile fis = new RandomAccessFile("shm.lock","rw");
// 獲得文件通道
FileChannel lockfc = fis.getChannel();
// 獲得文件的獨占鎖,該方法不產生堵塞,立刻返回
FileLock flock = lockfc.tryLock();
// 如果為空,則表明已經有應用占有該鎖
if(flock == null) {
...// 不能執(zhí)行寫操作
}else {
...// 可以執(zhí)行寫操作
}

該鎖會在應用異常退出后自動釋放,這正是該處所需要的方法。

相關文章

  • Java設計模式之備忘錄模式使用詳解

    Java設計模式之備忘錄模式使用詳解

    這篇文章主要介紹了Java設計模式中備忘錄模式的使用,備忘錄設計模式也叫作快照模式,主要用于實現(xiàn)防丟失、撤銷、恢復等功能,本文將通過示例為大家講解備忘錄模式的定義與使用,需要的同學可以參考一下
    2024-02-02
  • java 嵌套類的詳解及實例代碼

    java 嵌套類的詳解及實例代碼

    這篇文章主要介紹了java 嵌套類的詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • IDEA如何進行commit之后的代碼回退

    IDEA如何進行commit之后的代碼回退

    在 IntelliJ IDEA 中回退 Git 版本涉及查找提交記錄、復制提交編號、重置 HEAD 并強行推送到遠程倉庫,本文提供詳細步驟和注意事項,幫助用戶安全地回退到舊版本
    2024-09-09
  • SpringBoot如何集成Token

    SpringBoot如何集成Token

    文章介紹了如何使用jjwt插件實現(xiàn)Token的生成和校驗,該插件可以直接與SpringBoot集成,Token由三部分組成,分別是header、payload和signature,通過在請求頭中傳遞Token,后端可以驗證其合法性,從而提高安全性
    2025-01-01
  • 深入了解Java方法的重載與重寫

    深入了解Java方法的重載與重寫

    在最初學習java的時候,人們都知道,java這種面向對象的語言,一共有三大特征,分別是:封裝、繼承、多態(tài)。多態(tài)的實現(xiàn)途徑有三種:重寫、重載、接口實現(xiàn)。本文就來為大家詳細講講Java方法的重載與重寫
    2022-07-07
  • 一文搞懂Java SPI機制的原理與使用

    一文搞懂Java SPI機制的原理與使用

    Java 程序員在日常工作中經常會聽到 SPI,而且很多框架都使用了 SPI 的技術,那么問題來了,到底什么是 SPI 呢?今天小編就帶大家好好了解一下 SPI
    2022-10-10
  • Java實現(xiàn)五子棋游戲的完整代碼

    Java實現(xiàn)五子棋游戲的完整代碼

    這篇文章主要為大家詳細介紹了Java實現(xiàn)五子棋游戲的完整代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Java詳細講解文件的讀寫操作方法

    Java詳細講解文件的讀寫操作方法

    文件讀寫主要依靠io流完成,流(Stream)是指一連串的數(shù)據(jù)(字符或字節(jié)),是以先進先出的方式發(fā)送信息的通道,數(shù)據(jù)源發(fā)送的數(shù)據(jù)經過這個通道到達目的地,按流向區(qū)分為輸入流和輸出流
    2022-04-04
  • Spring boot調用Oracle存儲過程的兩種方式及完整代碼

    Spring boot調用Oracle存儲過程的兩種方式及完整代碼

    這篇文章主要給大家介紹了關于Spring boot調用Oracle存儲過程的兩種方式及完整代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-08-08
  • java中abstract修改類的實例方法

    java中abstract修改類的實例方法

    在本篇文章里小編給各位分享了一篇關于java中abstract修改類的實例方法,有需要的朋友們可以學習下。
    2020-12-12

最新評論

论坛| 新巴尔虎右旗| 徐水县| 万安县| 兴国县| 宁城县| 内乡县| 祥云县| 宜兰市| 泰安市| 旌德县| 松潘县| 河北区| 育儿| 务川| 嘉义县| 吉木乃县| 余姚市| 成武县| 浦县| 封开县| 武威市| 陇西县| 上蔡县| 江油市| 洞头县| 澄城县| 上犹县| 库尔勒市| 元朗区| 六安市| 宁强县| 濮阳市| 齐齐哈尔市| 山阳县| 桓台县| 客服| 绩溪县| 玉林市| 疏勒县| 健康|