java代碼可以加鎖嗎 java代碼可以直接被執(zhí)行嗎

java 一個(gè)方法里面鎖里面能加鎖嗎

可以,套鎖,要注意的是內(nèi)鎖與外鎖,持有鎖不同,否者無意義!

成都創(chuàng)新互聯(lián)云計(jì)算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過13年的服務(wù)器租用、服務(wù)器托管德陽、云服務(wù)器、網(wǎng)站空間、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn),已先后獲得國家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專業(yè)提供云主機(jī)、網(wǎng)站空間、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。

另外這樣很容易發(fā)生死鎖現(xiàn)象!

java中文件加鎖機(jī)制是怎么實(shí)現(xiàn)的。

Java中文件加鎖機(jī)制如下:

在對(duì)文件操作過程中,有時(shí)候需要對(duì)文件進(jìn)行加鎖操作,防止其他線程訪問該文件。對(duì)文件的加鎖方法有兩種:

第一種方法:使用RandomAccessFile類操作文件。

在java.io.RandomAccessFile類的open方法,提供了參數(shù)實(shí)現(xiàn)獨(dú)占的方式打開文件:

RandomAccessFile raf = new RandomAccessFile(file, "rws");

其中的“rws”參數(shù),rw代表讀取和寫入,s代表了同步方式,也就是同步鎖。這種方式打開的文件,就是獨(dú)占方式的。

第二種方法:使用sun.nio.FileChannel對(duì)文件進(jìn)行加鎖。

代碼:

RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");

FileChannel fc = raf.getChannel();

FileLock fl = fc.tryLock();

if(fl.isValid())

System.out.println("You have got the file lock.");

以上是通過RandomAccessFile來獲得文件鎖的,方法如下:

代碼:

FileOutputStream fos = new FileOutputStream("file.txt");

FileChannel fc = fos.getChannel(); //獲取FileChannel對(duì)象

FileLock fl = fc.tryLock(); //or fc.lock();

if(null != fl)

System.out.println("You have got file lock.");

//TODO write content to file

//TODO write end, should release this lock

fl.release(); //釋放文件鎖

fos.close; //關(guān)閉文件寫操作

如果在讀文件操作的時(shí)候,對(duì)文件進(jìn)行加鎖,操作過程如下:

FileChannel也可以從FileInputStream中直接獲得,但是這種直接獲得FileChannel的對(duì)象直接去操作FileLock會(huì)報(bào)異常NonWritableChannelException,需要自己去實(shí)現(xiàn)getChannel方法,代碼如下:

private static FileChannel getChannel(FileInputStream fin, FileDescriptor fd) {

FileChannel channel = null;

synchronized(fin){

channel = FileChannelImpl.open(fd, true, true, fin);

return channel;

}

}

其實(shí),看FileInputStream時(shí),發(fā)現(xiàn)getChannel方法與我們寫的代碼只有一個(gè)地方不同,即open方法的第三個(gè)參數(shù)不同,如果設(shè)置為false,就不能鎖住文件了。缺省的getChannel方法,就是false,因此,不能鎖住文件。

java加鎖

對(duì)象是一個(gè)鎖標(biāo)志。按照先到先得的原則,如果有多個(gè)線程都會(huì)執(zhí)行代碼,并使用同一個(gè)對(duì)象作為鎖,

synchronize(對(duì)象){

....

}

那么,先執(zhí)行這段代碼的那個(gè)線程,將會(huì)獲得這個(gè)對(duì)象鎖,而當(dāng)這個(gè)線程執(zhí)行這段代碼的時(shí)候,其他線程也是使用這個(gè)對(duì)象作為鎖的,就不能執(zhí)行這段代碼,知道最初得到這個(gè)鎖的線程運(yùn)行完這段代碼,然后再把鎖分配給下一個(gè)線程執(zhí)行。

分享標(biāo)題:java代碼可以加鎖嗎 java代碼可以直接被執(zhí)行嗎
網(wǎng)頁URL:http://bm7419.com/article10/ddcosgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站內(nèi)鏈關(guān)鍵詞優(yōu)化、網(wǎng)站改版、微信小程序品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)