當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java FileChannel tryLock()用法及代碼示例


對於同時執行多個線程的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()方法。當線程之一獲取鎖並對文件進行操作時,如果第二個線程調用要獲取的鎖,則該方法會引發異常,因為無法自由獲取文件。在上麵的代碼中,我們已經明確獲取了整個文件的鎖定。如果需要,我們可以更改必須獲取鎖的文件部分的大小。

相關用法


注:本文由純淨天空篩選整理自harshkumarchoudhary144大神的英文原創作品 FileChannel Class tryLock() Method in Java with Examples。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。