程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 扼要剖析Java多過程編程的並發掌握

扼要剖析Java多過程編程的並發掌握

編輯:關於JAVA

扼要剖析Java多過程編程的並發掌握。本站提示廣大學習愛好者:(扼要剖析Java多過程編程的並發掌握)文章只能為提供參考,不一定能成為您想要的結果。以下是扼要剖析Java多過程編程的並發掌握正文


過程間的通信不過就是讀寫文件,socket通信或許應用同享內存。
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); // 寫入同享內存頭部信息
 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 {
...// 可以履行寫操作
}

該鎖會在運用異常加入後主動釋放,這恰是該地方須要的辦法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved