多個地方同時向一個檔案讀寫的互斥問題解決方案
場景:多個地方同時向一個檔案讀寫據,如何保持操作互斥性,即一次只能一個操作(比如讀或寫)進行。
我們希望在一個執行緒在操作某個檔案的時候,其他執行緒不能對該檔案進行讀或寫操作,要怎麼才能實現呢?利用java提供的synchronized似乎無法完成,因為每個執行緒是在程式中動態丟擲的.鬱昧了一天之後,我終於找到了一個解決辦法,就是利用java.nio包中的FileChannel對檔案進行加鎖.
具體實現方法如下:
1.寫檔案的執行緒
2.讀檔案的執行緒
3.分別啟用兩個執行緒
4.結果分析
以上程式在對一個檔案執行寫操作前,先對該檔案加鎖,這樣其他執行緒就不能再對該檔案操作,等該執行緒的寫操作結束,釋放資源,其他執行緒才可以繼續對該檔案執行相應的讀寫操作.
可是,鬱昧的是,這段程式在windows下可以正確執行,在linux下卻無效.根據<Thinking in Java>上的觀點是:對獨佔鎖或者共享鎖的支援必須由底層的作業系統提供。
相關推薦
多個地方同時向一個檔案讀寫的互斥問題解決方案
場景:多個地方同時向一個檔案讀寫據,如何保持操作互斥性,即一次只能一個操作(比如讀或寫)進行。 我們希望在一個執行緒在操作某個檔案的時候,其他執行緒不能對該檔案進行讀或寫操作,要怎麼才能實現呢?利用java提供的synchronized似乎無法完成,因為每個執行緒是在程
Linux下多個程序或執行緒同時對一個檔案進行寫操作
標頭檔案 #include<sys/file.h> 定義函式 int flock(int fd,int operation); 函式說明 flock()會依引數operation所指定的方式對引數fd所指的檔案做各種鎖定或解除鎖定的動作。此函式只能鎖定整個檔案,無法鎖定檔案的某一區域。 引數ope
python 預設值引數 別名 多個名稱同時表示一個引數
#python3 win10 def yy(background=0,bg=0): ''' 預設值引數別名的實現 ''' res = background if background != 0 else bg return res print(yy(backgr
涉及多平臺版本的中英文字元檔案讀寫和轉換
參考文件: 1. 在多個編譯版本中,中英文在傳遞時,可能採用不同的格式 _UNICODE定義時,中英文字元都按unicode格式儲存(CString使用CStringW-wchar_t型儲存) MBCS時,英文字元1個位元組,中文字元兩個位元組(CSt
多個WKWebView頁面的cookie不共享問題及解決方案
本人在開發過程中遇到一個奇怪的問題,採用UIWebView時,用微信授權後進入繫結手機號頁面,繫結手機號成功,然後重新生成一個頁面(UIViewController主頁),進入新頁面銷燬繫結手機號h5頁面(UIViewController),主頁正常顯示。但是採
[原]檔案讀寫互斥
該文是2005年底在老東家開發監控程式時遇到的一個經典問題。回過頭看來,竟然有同學(或者老師)看了該文,並給出了一條非常給力的評價,深感榮幸。 返回頭看這篇文章,基本上給人一種凌亂的感覺,幸運的是沒有多少人看過。作為對自己的反省,將該文重新整理結構,梳理結果。原文將作為歷史文物保留。 問題提出:系統程序/
Android4.4之後的外接SD卡檔案讀寫的解決方法
在Android4.4之後,普通應用就沒有外接SD卡的寫許可權了,對於要操作外接SD的應用來說就是個災難了。 我最近做一個檔案管理器,發現外卡只有讀許可權,沒有辦法進行其他操作,剛開始以為是需要執行時許可權,然後進隊許可權進行申請,發現還是不行,然後繼續百度Google基本
MYSQL讀寫分離解決方案:MariaDB MaxScale部署實錄
maxscaleMASTER(KING01)[root@king01 ~]# mysql -uroot -pabcd.1234 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 173 S
MYSQL讀寫分離解決方案:MYCAT部署實錄
mysql mycat 讀寫分離 MASTER (KING01)[root@king01 ~]# mysql -uroot -pabcd.1234 mysql> show master status; +------------------+----------+--------------
應用技術瓶頸之資料庫讀寫分離解決方案
一直沒時間寫部落格了,一直在專研產品設計與技術解決方案。多年的積累與專案實戰發現專案業務幾乎每個程式設計師都能寫,但是解決方案卻不一定每個人能解決掉。我所認知的一個專案由於時間跟業務的爆發都會遇到兩個最大的技術瓶頸挑戰: 1、資料庫端的壓力瓶頸,以前再華為hwa專案組搞hadoop大資料時我就清晰的知道,專
CLion工程中只能有一個main函式 &&怎麼同時編寫多個main函式的C檔案
記得大一學C語言的時候,我們就知道一個工程中只能有一個main函式 最近下載了CLion,我很懶,想在一個工程下建好幾個c檔案,裡面都有main函式,結果編譯執行的時候不通過 這才想起來,無論有多少複雜的c檔案和函式,絕對有且只有一個main函式 記得把其他帶有main函式的檔案
關於Socket通訊中多個執行緒同時向一個服務埠傳送資料時的注意點
近幾天在開發的程式裡面有相關模組使用到了Socket通訊,其中存在多個類似功能的模組,這些模組可能出現在同一時間段向一個服務端埠傳送訊息的情況,剛開始使用一個socket去通訊,結果發現異常頻繁出現.(事實上,當傳送間隔很長,比如每200ms才會有一次傳送,那麼兩個執行緒之
100個線程同時向一個銀行賬戶中存入1元錢
事情 調整 ice r12 同步機制 狀況 private nta tst 下面的例子演示了100個線程同時向一個銀行賬戶中存入1元錢,在沒有使用同步機制和使用同步機制情況下的執行情況。 銀行賬戶類: 1 2 3 4 5 6 7 8 9 10 11 12 1
如何確保多個程序同時寫入要給檔案成功
function write_file($filename, $content) { $lock = $filename . '.lck'; $write_length = 0; while(true) { if( file_exists($lock) )
一個生產者生產產品,多個消費者同時獲得產品
void * produce(void *ptr) { for (int i = 0; i < 20; ++i) { pthread_rwlock_wrlock(&sharedData.rwlock); sharedData.product = i
hadoop怎麼分割寫入的檔案為多個塊的,一個map對應一個split分片嗎?split與block的關係
1,在介紹hadoop寫檔案的時候我們經常會說首先分割檔案為多個塊;那麼是怎麼分割的呢?這裡其實不要有過的糾結,這裡的塊是block,是hdfs中切塊的大小,屬於物理劃分,預設64M,在hadoop-default.xml配置中有體現:<property>
Java例項說明 100個執行緒同時向一個銀行賬戶中存入1元錢,在沒有使用同步機制和使用同步機制情況下的執行情況
銀行賬戶類: public class Account {private double balance; // 賬戶餘額public void deposit(double money) {double newBalance = balance + money;try {T
Git fetch pull 的應用, git 多人同時修改一個檔案後的合併
Git中從遠端的分支獲取最新的版本到本地有這樣2個命令:1. git fetch:相當於是從遠端獲取最新版本到本地,不會自動merge git fetch origin master git log -p master..origin/master git merge
Qt操作多個Sqlite資料庫和檔案讀寫
摘要: Qt自帶了sqlite的驅動,也有各種檔案的讀寫操作,用起來很是方便,這裡僅僅是做了一個簡單的封裝,方便多個數據庫和多個檔案的操作。 用到這塊的時候網上搜了很多參考資料,感謝大家的無私分享,這裡把搜後整理的結果分享給大家,對無私分享的廣
轉:Linux 雙網卡配置兩個IP同時只有一個會通的原因
每次 網關 font onf ipv proc 發現 檢查 echo 根本原因: Linux默認啟用了反向路由檢查 如果2個網卡在一個Lan裏面,那麽服務器可能從eth0或者eth1發現網關, 如果一個包從eth0進入了, 而網關在eth1上, 那麽從eth1是出不去的,