【Java NIO深入研究3】文件鎖

1.1概述——文件鎖

?

文件鎖定初看起來可能讓人迷惑。它 似乎 指的是防止程序或者用戶訪問特定文件。事實上,文件鎖就像常規的?Java?對象鎖 — 它們是 勸告式的(advisory) 鎖。它們不阻止任何形式的數據訪問,相反,它們通過鎖的共享和獲取賴允許系統的不同部分相互協調。

?

您可以鎖定整個文件或者文件的一部分。如果您獲取一個排它鎖,那么其他人就不能獲得同一個文件或者文件的一部分上的鎖。如果您獲得一個共享鎖,那么其他人可以獲得同一個文件或者文件一部分上的共享鎖,但是不能獲得排它鎖。文件鎖定并不總是出于保護數據的目的。例如,您可能臨時鎖定一個文件以保證特定的寫操作成為原子的,而不會有其他程序的干擾。

?

大多數操作系統提供了文件系統鎖,但是它們并不都是采用同樣的方式。有些實現提供了共享鎖,而另一些僅提供了排它鎖。事實上,有些實現使得文件的鎖定部分不可訪問,盡管大多數實現不是這樣的。

?

在本節中,您將學習如何在?NIO?中執行簡單的文件鎖過程,我們還將探討一些保證被鎖定的文件盡可能可移植的方法。

?

1.2文件鎖定和可移植性

?

文件鎖定可能是一個復雜的操作,特別是考慮到不同的操作系統是以不同的方式實現鎖這一事實。下面的指導原則將幫助您盡可能保持代碼的可移植性:

只使用排它鎖。

將所有的鎖視為勸告式的(advisory)。

public class UseFileLocks
{static private final int start = 10;static private final int end = 20;static public void main( String args[] ) throws Exception {new Thread(new Runnable() {public void run() {// Get file channelRandomAccessFile raf = null;try {raf = new RandomAccessFile( "usefilelocks.txt", "rw" );} catch (FileNotFoundException e) {// TODO Auto-generated catch block
                e.printStackTrace();}FileChannel fc = raf.getChannel();// Get lockSystem.out.println( "trying to get lock" );FileLock lock = null;try {lock = fc.lock( start, end, false );} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}System.out.println( "got lock!" );// PauseSystem.out.println( "pausing" );try { Thread.sleep( 5000 ); } catch( InterruptedException ie ) {}// Release lockSystem.out.println( "going to release lock" );try {lock.release();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}System.out.println( "released lock" );try {raf.close();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}).start();new Thread(new Runnable() {public void run() {// Get file channelRandomAccessFile raf = null;try {raf = new RandomAccessFile( "usefilelocks.txt", "rw" );} catch (FileNotFoundException e) {// TODO Auto-generated catch block
                e.printStackTrace();}FileChannel fc = raf.getChannel();// Get lockSystem.out.println( "trying to get lock" );FileLock lock = null;try {lock = fc.lock( start, end, false );} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}System.out.println( "got lock!" );// Release lockSystem.out.println( "going to release lock" );try {lock.release();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}System.out.println( "released lock" );try {raf.close();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}).start();}}

運行結果:

trying to get lock
trying to get lock
got lock!
going to release lock
released lock
Exception in thread "Thread-0" java.nio.channels.OverlappingFileLockException
at sun.nio.ch.SharedFileLockTable.checkList(Unknown Source)
at sun.nio.ch.SharedFileLockTable.add(Unknown Source)
at sun.nio.ch.FileChannelImpl.lock(Unknown Source)
at zhongqiu.common.base.nio.UseFileLocks$1.run(UseFileLocks.java:28)
at java.lang.Thread.run(Unknown Source)

轉載于:https://www.cnblogs.com/guweiwei/p/6527059.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393554.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393554.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2018-2019-2 網絡對抗技術 20165202 Exp9 Web安全基礎

博客目錄 一、實踐內容 跨站腳本攻擊XSS跨站請求偽造CSRFSQL注入攻擊二、實驗中遇到的問題及解決三、基礎問題回答四、實驗總結一、實踐內容 本實踐的目標理解常用網絡攻擊技術的基本原理。Webgoat實踐下相關實驗。具體過程: 跨站腳本攻擊XSS跨站請求偽造CSRFSQL注入…

leetcode696. 計數二進制子串

給定一個字符串 s,計算具有相同數量0和1的非空(連續)子字符串的數量,并且這些子字符串中的所有0和所有1都是組合在一起的。 重復出現的子串要計算它們出現的次數。 示例 1 : 輸入: “00110011” 輸出: 6 解釋: 有6個子串具有相同數量的連續1和0&#…

idea無法忍受_不要成為無法忍受的軟件開發人員

idea無法忍受by Bruce Flow通過布魯斯流 不要成為無法忍受的軟件開發人員 (Don’t be the software developer you can’t stand working with) I have more than 10 years of industry experience as a software developer. I am working at one of the largest tech compani…

項目需求分析答辯總結

前言 組長成員★530 雨勤311 旭403 俊223 元437 海輝你一定也不想做的 本次作業沒什么可看的 項目需求分析看完記得投幣的 一分鐘宣傳視頻本組對其他各組評審結果 編號團隊名稱項目名稱報告格式/20演示內容/20答辯內容/20PPT制作/20演講/20總分/1001天機組指尖加密15.013.613.6…

xml編輯 html_【c# .net】Xml讀寫操作(XmlTextReader 類)

Xml讀寫操作(XmlTextReader 類)1.XML簡介1)XML 和 HTML 的設計初衷XML 被設計用來傳輸和存儲數據HTML 被設計用來顯示數據2)什么是 XML?XML 指可擴展標記語言(EXtensible Markup Language)XML 是一種標記語…

jQ層級選擇器

<!DOCTYPE html><html> <head> <meta charset"utf-8" /> <title></title> </head> <body> </body></html> <h1>沁園春雪</h1> <h2>毛***</h2> <div> <span> <d…

spring 獲取url參數

1. usl格式&#xff1a; http://localhost:8080/contact/delete/3 java代碼 RequestMapping(value"/delete/{id}")public Map<String,Object> delete(PathVariable("id") Integer id){boolean result contactService.deleteContactById(id); 也可以…

leetcode475. 供暖器(二分查找)

冬季已經來臨。 你的任務是設計一個有固定加熱半徑的供暖器向所有房屋供暖。 現在&#xff0c;給出位于一條水平線上的房屋和供暖器的位置&#xff0c;找到可以覆蓋所有房屋的最小加熱半徑。 所以&#xff0c;你的輸入將會是房屋和供暖器的位置。你將輸出供暖器的最小加熱半徑…

如何在命令行中使用jq將JSON轉換為CSV

by Knut Melvr通過納特梅爾瓦 如何在命令行中使用jq將JSON轉換為CSV (How to transform JSON to CSV using jq in the command line) The shell tool jq is awesome for dealing with JSON-data. It can also transform that data into handy CSV-files, ready for all your s…

macaca運行報錯之chrome-driver問題處理,關閉 Chrome 的自動更新

自動更新是 Chrome 非常實用的功能之一&#xff0c;但在有些情況下可能還是有關閉自動更新的需求&#xff0c;比如需要用某一個具體的版本來測試一些東西&#xff0c;或者更新之后反而出現了新的 Bug等等。由于一般人沒有這樣的需求&#xff0c;所以 Google 沒有公布關閉自動更…

docker啟動sqlserver_Docker搭建SQLServer

一、下載鏡像docker pull microsoft/mssql-server-linux二、啟動容器docker-composeversion: 3services:sqlserver:image: microsoft/mssql-server-linux:latestrestart: alwaysprivileged: truecontainer_name: sqlserverports:- 1433:1433volumes:- ./data:/var/opt/mssql/da…

【Python】 子進程創建與使用subprocess

subprocess *****本文參考了Vamei大神的http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html   運用subprocess包可以在運行python的進程下進一步開啟一個子進程&#xff0c;創建子進程要注意 1. 父進程是否暫停 2.創建出的子進程返回了什么 3.執行出錯&#xff0c…

異步查詢回調函數調用

異步查詢數據&#xff0c;需要對返回的數據進行后續步驟操作&#xff0c;使用使用方法&#xff1a; 1、new promise方法使用。 2、回調函數使用 使用方式&#xff1a;   pageGetDeviceTreeInfo({deviceTypeAry:[1]},this.getTreeData); 函數&#xff1a; 1 export function p…

前端開發從項目中獲得什么_我如何獲得副項目的前10個客戶以及從他們那里學到的東西...

前端開發從項目中獲得什么by Tigran Hakobyan由Tigran Hakobyan 我如何獲得副項目的前10個客戶以及從他們那里學到的東西 (How I got my first 10 customers for my side-project and what I’ve learned from them) My name is Tigran, I’m 29, and I’m the creator of Cro…

leetcode278. 第一個錯誤的版本(二分查找)

你是產品經理&#xff0c;目前正在帶領一個團隊開發新的產品。不幸的是&#xff0c;你的產品的最新版本沒有通過質量檢測。由于每個版本都是基于之前的版本開發的&#xff0c;所以錯誤的版本之后的所有版本都是錯的。 假設你有 n 個版本 [1, 2, …, n]&#xff0c;你想找出導致…

lrzsz ??linux與windows互傳

2019獨角獸企業重金招聘Python工程師標準>>> lrzsz linux與windows互傳 # 前提是使用 xshell 或者 securecrt 這兩個遠程軟件&#xff0c;putty不支持 yum install -y lrzsz //安裝文件包 linux向windows 傳文件使用 &#xff1a; sz 文件名 回…

mysql show 命令_mysql show 相關命令

processlist的show方式是不能使用過濾查找&#xff0c;可能源自MySQL的內部安全機制吧&#xff0c;show是用來查看MySQL內部運行數據&#xff0c;其實processlist就是information_schema數據庫中的一張表&#xff0c;那么通過查表的方式肯定是可以的了&#xff1a;SELECT user,…

ordereddict有序字典

import collections as con# 有序添加和取字典元素 ord con.OrderedDict() ord[a] 1 ord[b] 2 ord[c] 3 print(ord, ordereddict)# 移動某元素到最后 ord.move_to_end(a) print(ord, move_to_end)轉載于:https://www.cnblogs.com/xh4528/p/6538700.html

Spring: (一) -- 春雨潤物之 核心IOC

作為一個Java人&#xff0c;想必都或多或少的了解過Spring。對于其優勢也能道個一二&#xff0c;諸如方便解耦、支持AOP編程、支持聲明式事務、方便測試等等。Spring也不僅僅局限于服務器端開發&#xff0c;它可以做非常多的事情&#xff0c;任何Java應用都可以在簡單性、可測試…

reactjs快速如夢_幫助您理解和創建ReactJS應用的快速指南

reactjs快速如夢此帖子分為2部分 (This Post is divided into 2 parts) The First Part demonstrates how to create a simple React app using ‘create-react-app’ CLI and explains the project structure. 第一部分演示了如何使用“ create-react-app” CLI創建簡單的Reac…