導航:首頁 > 版本升級 > java文件讀寫鎖

java文件讀寫鎖

發布時間:2024-09-05 07:30:40

① 【java】鎖、線程、並發

Java中涉及並發控制的關鍵概念包括鎖、線程池、線程狀態以及同步機制。鎖有多種類型,如公平鎖/非公平鎖(決定獲取順序),可重入/不可重入(允許遞歸調用),共享/獨享(共享或獨占資源),讀寫鎖(讀操作可同時進行,寫操作互斥),樂觀/悲觀鎖(讀取時不加鎖,更新前檢查),以及偏向鎖、輕量級鎖和重量級鎖(JVM優化)。鎖的狀態存儲在對象頭的Mark Word中,不同狀態影響著線程獲取鎖的效率和線程間的競爭。

線程池是管理線程的容器,如FixedThreadPool(適用於CPU密集任務,防止資源耗盡),CachedThreadPool(處理大量短期任務,可能導致內存溢出),以及ScheledThreadPool(周期性任務)。線程池的創建和運行規則涉及核心線程數、最大線程數、隊列策略等,例如,當任務多於核心線程數時,任務會被放入隊列等待執行或被拒絕。

線程狀態包括start、getPriority、interrupt和join等方法,它們影響線程的生命周期、優先順序調整、中斷行為和線程同步。創建線程時,需要理解死鎖的四個必要條件,如互斥、請求與保持、資源不剝奪和循環等待。

同步機制包括volatile(保證可見性,不保證原子性)和synchronized(提供互斥鎖,用於方法和代碼塊),以及更底層的CAS(原子性更新)和ReentrantLock。volatile常用於輕量級同步,而synchronized提供更強大的鎖定,ReentrantLock則提供了更多的控制選項。

並發工具如CountDownLatch(線程等待計數器),CyclicBarrier(線程同步屏障),Semaphore(線程數量限制),Future(非同步任務結果),Exchanger(線程間數據交換)和Phaser(靈活的屏障)在實際編程中有著廣泛的應用,而ThreadLocal則用於線程私有數據的存儲,避免線程間數據共享帶來的問題。

② java 鎖有幾種

樂觀鎖/悲觀鎖

樂觀鎖與悲觀鎖不是指具體的什麼類型的鎖,而是指看待並發同步的角度。

悲觀鎖認為對於同一個數據的並發操作,一定是會發生修改的,哪怕沒有修改,也會認為修改。因此對於同一個數據的並發操作,悲觀鎖採取加鎖的形式。悲觀的認為,不加鎖的並發操作一定會出問題。
樂觀鎖則認為對於同一個數據的並發操作,是不會發生修改的。在更新數據的時候,會採用嘗試更新,不斷重新的方式更新數據。樂觀的認為,不加鎖的並發操作是沒有事情的。
從上面的描述我們可以看出,悲觀鎖適合寫操作非常多的場景,樂觀鎖適合讀操作非常多的場景,不加鎖會帶來大量的性能提升。
公平鎖/非公平鎖

公平鎖是指多個線程按照申請鎖的順序來獲取鎖。

非公平鎖是指多個線程獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的線程比先申請的線程優先獲取鎖。

優點:在於吞吐量比公平鎖大。
缺點:可能會造成優先順序反轉或者某些線程飢餓現象(一直拿不到鎖)。
對於Java ReentrantLock而言,通過構造函數指定該鎖是否是公平鎖,默認是非公平鎖。
對於Synchronized而言,也是一種非公平鎖。由於其並不像ReentrantLock是通過AQS的來實現線程調度,所以並沒有任何辦法使其變成公平鎖。
可重入鎖

可重入鎖的概念是自己可以再次獲取自己的內部鎖。
舉個例子,比如一條線程獲得了某個對象的鎖,此時這個對象鎖還沒有釋放,當其再次想要獲取這個對象的鎖的時候還是可以獲取的(如果不可重入的鎖的話,此刻會造成死鎖)。說的更高深一點可重入鎖是一種遞歸無阻塞的同步機制。
對於Java ReentrantLock而言, 他的名字就可以看出是一個可重入鎖,其名字是Re entrant Lock重新進入鎖。
對於Synchronized而言,也是一個可重入鎖。可重入鎖的一個好處是可一定程度避免死鎖。
獨享鎖/共享鎖

獨享鎖是指該鎖一次只能被一個線程所持有。
共享鎖是指該鎖可被多個線程所持有。
對於Java ReentrantLock(互斥鎖)而言,其是獨享鎖。
但是對於Lock的另一個實現類ReadWriteLock(讀寫鎖),其讀鎖是共享鎖,其寫鎖是獨享鎖。讀鎖的共享鎖可保證並發讀是非常高效的,讀寫,寫讀 ,寫寫的過程是互斥的。
對於Synchronized而言,當然是獨享鎖。
分段鎖

分段鎖其實是一種鎖的設計,並不是具體的一種鎖。對於ConcurrentHashMap而言,其並發的實現就是通過分段鎖的形式來實現高效的並發操作。

我們以ConcurrentHashMap來說一下分段鎖的含義以及設計思想,ConcurrentHashMap中的分段鎖稱為Segment,它即類似於HashMap(JDK7與JDK8中HashMap的實現)的結構,即內部擁有一個Entry數組,數組中的每個元素又是一個鏈表;同時又是一個ReentrantLock(Segment繼承了ReentrantLock)。
當需要put元素的時候,並不是對整個hashmap進行加鎖,而是先通過hashcode來知道他要放在那一個分段中,然後對這個分段進行加鎖,所以當多線程put的時候,只要不是放在一個分段中,就實現了真正的並行的插入。
但是,在統計size的時候,可就是獲取hashmap全局信息的時候,就需要獲取所有的分段鎖才能統計。
分段鎖的設計目的是細化鎖的粒度,當操作不需要更新整個數組的時候,就僅僅針對數組中的一項進行加鎖操作。
互斥鎖:

無法獲取瑣時,進線程立刻放棄剩餘的時間片並進入阻塞(或者說掛起)狀態,同時保存寄存器和程序計數器的內容(保存現場,上下文切換的前半部分),當可以獲取鎖時,進線程激活,等待被調度進CPU並恢復現場(上下文切換下半部分)

上下文切換會帶來數十微秒的開銷,不要在性能敏感的地方用互斥鎖
讀寫鎖:

1)多個讀者可以同時進行讀
2)寫者必須互斥(只允許一個寫者寫,也不能讀者寫者同時進行)
3)寫者優先於讀者(一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者)
自旋鎖:

自旋鎖是指嘗試獲取鎖的線程不會立即阻塞,而是採用循環的方式去嘗試獲取鎖,這樣的好處是減少線程上下文切換的消耗,缺點是循環會消耗CPU。

③ java 中如何判斷當前的文件是否正在被別人使用中

方式一:用租基桐RandomAccessFile類操作文件
RandomAccessFile的open方法,提供了參數,實現以獨占的方式打開文件:
new RandomAccessFile(file, "rws")
其中的「rws」參數中,rw代表鋒蘆讀寫方式,s代表同步方式,也就是鎖。這種方式打開的文件弊坦,就是獨占方式。

方式二:用文件通道(FileChannel)的鎖功能

如:
RandomAccessFile raf = new RandomAccessFile(new File("c:\\test.txt"), "rw");
FileChannel fc = raf.getChannel();
FileLock fl = fc.tryLock();
if (fl.isValid()) {
System.out.println("get the lock!");

④ JAVA鎖有哪些種類,以及區別

常見的Java鎖有下面這些:

閱讀全文

與java文件讀寫鎖相關的資料

熱點內容
painter2015視頻教程 瀏覽:204
jsperror 瀏覽:183
網路到底怎麼賺錢 瀏覽:402
蘋果耳機插口接觸不良 瀏覽:934
運動手環app哪個好 瀏覽:854
java設置double精度 瀏覽:587
java代碼分享網站 瀏覽:321
ps怎麼復制到文件裡面 瀏覽:360
win7管理員指紋登錄密碼忘了怎麼辦 瀏覽:38
c是一次性插入多少條數據 瀏覽:928
u盤文件編輯軟體 瀏覽:767
vb如何打開pdf文件 瀏覽:351
soundlinkiii升級 瀏覽:64
如何把文件改成cad 瀏覽:676
如何把多個監控合在一個網路內 瀏覽:637
qq的頭像在哪個文件夾 瀏覽:468
linuxexfat補丁 瀏覽:582
excelvb編程怎麼輸出數 瀏覽:737
567位qq 瀏覽:172
qq網名女生傷感 瀏覽:292

友情鏈接