對於同時執行多個線程的multi-threaded程序,我們需要獲取並釋放鎖,以保持進程之間的同步。 java的FileChannel類還提供一種稱為trylock()的方法,該方法用於獲取對指定File的鎖定。此方法用於獲取在該方法的參數中指定的文件的任何區域上的鎖定。
鎖定可能是比標準同步塊更靈活,更複雜的線程同步機製。鎖可以是用於控製多個線程對共享資源的訪問的工具。通常,鎖提供對共享資源的獨占訪問:一次隻有一個線程可以獲取該鎖,每個訪問共享資源的人都需要先獲取該鎖。但是,某些鎖可能允許並發訪問共享資源,例如ReadWriteLock的讀取鎖。
此處的輸出是FileLock類的對象,該對象提到已應用的鎖定,如果未應用任何鎖定(可能是由於某些其他進程正在保存或寫入文件的原因),則此方法將返回null。 Position變量指定要從中獲取鎖的文件的標記,並且範圍(要獲取鎖的程度)由‘size’變量給出。如果在第二個參數的位置未提及任何內容,則默認使用Long.MAX_VALUE的大小。 “shared”布爾變量表明是否共享鎖。如果為假,則該鎖是互斥的,否則將在其他進程之間共享。這些是同步方法的一些基礎知識。其默認值為false。
這種方法的主要優點是它永遠不會被阻塞。調用之後,它或者返回獲取的鎖,或者在文件由另一個進程處理的情況下返回null或引發異常。此方法通常與同一類的lock()方法不同,因為在同步過程中,該過程必須等待很長時間才能訪問文件或資源並獲取鎖,但是此方法將永遠不會等待,它將返回null或異常。
用法:方法聲明
public abstract FileLock tryLock(long position, long size, boolean shared) throws IOException
示例
Java
// Java Program to illustarte FileChannel Class
// tryLock() method
// Importing libraries
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
// save the file named as GFG.java
public class GFG extends Thread {
// content to be written in the file.
String input
= "geeks for geeks is a learning portal for computer sciences.";
ByteBuffer buf = ByteBuffer.wrap(input.getBytes());
// path of the file
String fp = "gfg.txt";
// file channel class object
Path pt = Paths.get(fp);
public void run()
{
try {
// the thread says if file is opened.
FileChannel fc = FileChannel.open(
pt, StandardOpenOption.WRITE,
StandardOpenOption.APPEND);
System.out.println(
Thread.currentThread().getId()
+ "says:File channel is opened for writing");
// trying lock
fc.tryLock(0L, Long.MAX_VALUE, false);
System.out.println(
Thread.currentThread().getId()
+ "says:acquiring lock");
// writing
fc.write(buf);
// release the Lock after writing
System.out.print(Thread.currentThread().getId()
+ "says:");
System.out.println(
"writing is done, closing the file");
// Closing the file connections
fc.close();
}
// Catch block to handle the exception
catch (Exception e) {
// Getting and printing current threads
System.out.println(
Thread.currentThread().getId()
+ "says:Exception" + e);
}
// Here, one file raises exception since the file
// is being written by another thread.
}
// Main driver method
public static void main(String[] args) throws Exception
{
// Creating an object in the main() method
GFG g1 = new GFG();
GFG g2 = new GFG();
// Calling start() methods over the objects
g1.start();
g2.start();
// Here Two thread in concurrency
// are trying to access the file
}
}
輸出:
輸出說明:
我們正在創建兩個線程,它們將嘗試訪問文件並對其執行寫操作。因為要保持同步,所以我們使用trylock()方法。當線程之一獲取鎖並對文件進行操作時,如果第二個線程調用要獲取的鎖,則該方法會引發異常,因為無法自由獲取文件。在上麵的代碼中,我們已經明確獲取了整個文件的鎖定。如果需要,我們可以更改必須獲取鎖的文件部分的大小。
相關用法
- Java Java.util.concurrent.RecursiveAction用法及代碼示例
- Java Java.util.concurrent.RecursiveTask用法及代碼示例
- Java Java.awt.image.RescaleOp用法及代碼示例
- Java Java.util.concurrent.Phaser用法及代碼示例
- Java Class getModule()用法及代碼示例
- Java Class getPackage()用法及代碼示例
- Java Class getPackageName()用法及代碼示例
- Java Class getTypeParameters()用法及代碼示例
- Java Class getDeclaredClasses()用法及代碼示例
- Java Class getDeclaredMethods()用法及代碼示例
- Java Class getDeclaredFields()用法及代碼示例
- Java Class getConstructors()用法及代碼示例
- Java Class getName()用法及代碼示例
- Java Class getGenericSuperclass()用法及代碼示例
- Java Class getClassLoader()用法及代碼示例
- Java Class getSuperclass()用法及代碼示例
- Java Class isEnum()用法及代碼示例
注:本文由純淨天空篩選整理自harshkumarchoudhary144大神的英文原創作品 FileChannel Class tryLock() Method in Java with Examples。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。