JavaRush /Java Blog /Random-TW /茶歇#171。如何使用synchronized關鍵字。Java 中的檔案處理

茶歇#171。如何使用synchronized關鍵字。Java 中的檔案處理

在 Random-TW 群組發布

如何使用synchronized關鍵字

來源:Medium 今天您將了解在什麼情況下以及如何正確使用Java 程式語言中的synchronized 關鍵字。 茶歇#171。 如何使用synchronized關鍵字。 Java 中的檔案處理 - 1修飾符是 Java 中存在的某些關鍵字,借助它們我們可以更改變數、方法或類別的特徵並限制其範圍。Java 語言有相當多的修飾符集。Java 中的修飾符分為兩種類型 -存取修飾符存取修飾符。

無存取權限的修改器

不可存取修飾符為 JVM 提供有關類別、方法或變數的特徵的資訊。Java中有七種類型的非存取修飾符:
  • 最終的
  • 靜止的
  • 抽象的
  • 同步的
  • 易揮發的
  • 短暫的
  • 本國的
在這篇文章中,我們將仔細研究synchronized關鍵字。首先,讓我們定義何時何地使用它。

什麼情況下使用synchronized?

在 Java 中,synchronized 關鍵字用於提供對方法或程式碼區塊的存取控制。當執行緒嘗試執行同步方法或程式碼區塊時,它必須先取得鎖。一旦收到鎖,就可以開始執行。但是,任何其他嘗試執行相同同步方法或程式碼區塊的執行緒都將被阻塞,直到第一個執行緒釋放鎖定。這可確保一次只有一個執行緒可以執行程式碼,這對於維護資料完整性非常重要。Synchronized 關鍵字可以與靜態和非靜態方法以及程式碼區塊一起使用。
  • 與靜態方法一起使用時所有執行緒都會競爭同一鎖。這可能會影響效能,因此除非絕對必要,否則最好避免同步靜態方法。

  • 當與非靜態方法一起使用時,類別的每個實例都將擁有自己的鎖,因此多個執行緒可以同時執行來自不同實例的同步程式碼。這通常是首選方法。

  • 程式碼區塊一起使用時,會在傳遞給同步語句的物件上取得鎖。這允許多個執行緒同時執行來自不同物件的同步程式碼區塊。

因此,synchronized關鍵字是 Java 應用程式中控制並發資料存取的強大工具。如果正確使用,它可以幫助確保資料完整性並提高效能。

使用範例

1. 同步區塊

public class Counter {
  private int count = 0;

  public int getCount() {
    synchronized (this) {
      return count;
    }
  }

  public void increment() {
    synchronized (this) {
      count++;
    }
  }
}
這裡有兩個訪問計數器的程式碼區塊。其中最簡單的是get方法,它只是讀取值。乍一看,increment 方法似乎包含一行程式碼。但請記住,增量操作必須讀取目前值,加一,然後將新值寫回記憶體。換句話說,我們希望在不被其他執行緒中斷的情況下執行三個子操作。例如,將其放在另一側或使增量操作原子化。當我們在兩個程式碼區塊前面加上synchronized關鍵字時,需要注意的是,我們也將它們標記為特定物件的同步 ,如我們的範例所示。這意味著如果我們有多個Counter對象,那麼不同的執行緒可以同時更新這些不同的計數器。但是兩個執行緒不能同時在同一個Counter實例上執行同步區塊。

2. 同步方法

public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}
如果count是SynchronizedCounter的實例,那麼同步這些方法有兩個效果:
  • 首先,對同一物件上的同步方法的兩次呼叫不能交錯。當一個執行緒在物件上執行同步方法時,在該物件的同一塊上呼叫同步方法的所有其他執行緒都會暫停,直到第一個執行緒完成對該物件的處理。

  • 其次,當同步方法退出時,它會在同一物件上對同步方法的任何後續呼叫中自動將值設為「happens-before」。這確保了物件狀態的變更對所有執行緒都是可見的。

請記住,了解為什麼、如何以及何時使用同步以及其他修飾符需要經驗,而經驗需要時間。

Java 中的檔案處理

來源:Usemynotes 這篇文章的內容是關於 Java 中的檔案處理。您將熟悉文件處理操作、File 類別的方法以及流的類型。 茶歇#171。 如何使用synchronized關鍵字。 Java 中的檔案處理 - 2使用檔案是任何程式語言不可或缺的一部分。使用文件,程式可以將資料儲存在儲存設備上。對檔案執行各種操作(例如讀取或寫入)需要處理該檔案。文件處理定義為從文件讀取和寫入文件。要建立文件物件並處理不同的文件格式,我們可以使用java.io套件中的File類別。如果我們想使用File類,我們需要建立File類的物件並指定檔案名稱或路徑。使用這個類,我們可以存取檔案元數據,例如檔案名稱、檔案大小、權限、檔案類型等。
// importing all the classes of java.io
import java.io.*;
class FileHandle {
    public static void main(String[] arr) {
       // an object of File class is created.
       File f=new File("demo.txt");
}
}
要導入File類,您也可以使用import java.io.File而不是import java.io.*。現在讓我們了解線程,因為 Java 使用線程對檔案執行輸入/輸出 (I/O) 操作。

Java中什麼是執行緒?

流是資料序列。它也可以定義為位元組序列。流可用於表示輸入來源或目的地。來源和目標可以是磁碟、陣列、文字檔案等上的檔案。輸入流從來源讀取或檢索數據,輸出流將數據寫入目標。有兩種類型的流:

位元組流

位元組流用於對位元組資料執行讀寫操作。處理位元組流檔案的過程被定義為使用位元組資料執行輸入。與位元組流相關的類別有很多,但最常用的類別是FileInputStreamFileOutputStream
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
   FileInputStream fin=new FileInputStream("source_file.txt");
   FileOutputStream fout=new FileOutputStream("destination_file.txt");
   int character;
   while((character=fin.read())!=-1)
   {
      System.out.print((char)character);
      // writing to destination file
      fout.write((char)character);
   }
   // closing source_file.txt
   fin.close();
   // closing destination_file.txt
   fout.close();
 }
}
在上面的範例中,我們從來源檔案讀取資料並將資料寫入目標。-1表示文件結束。因此當出現-1時,將停止從來源檔案讀取。

字元流

字元流用於對字元資料進行讀寫操作。處理帶有字元流的檔案的過程就是執行帶有字元的輸入資料的過程。有許多可用的字元流類,但最常用的類別包括FileWriterFileReader。現在我們來討論File類別的一些方法。

Java中File類別的方法

可以閱讀()

該文件類別方法檢查文件是否可讀取並傳回一個布林值,即truefalse

可以寫()

這是一個文件類別方法,用於檢查文件是否可寫入並傳回一個布林值,即 true 或 false。

存在()

這是一個文件類別方法,用於檢查給定文件是否存在並傳回一個布林值。

建立新文件()

當我們想要建立一個新的空文件時,使用這個文件類別方法。它傳回一個布林值。

刪除()

這是一個文件類別方法,用於刪除文件並傳回一個布林值。

取得絕對路徑()

此方法用於傳回檔案的絕對路徑。getName() 此方法用於傳回字串值,該字串值是檔案的名稱。

列表()

它傳回一個表示目錄中所有檔案的字串陣列。

長度()

此文件類別方法傳回檔案大小(以位元組為單位)。

mkdir()

這是一個檔案類別方法,用於建立新目錄。讓我們來看看 Java 中可用的各種文件操作以及如何使用它們。

Java中的檔案操作是什麼?

在處理Java文件時,我們可以對文件進行以下操作:
  • 建立文件
  • 將資料寫入文件
  • 從文件中讀取數據
  • 刪除文件
  • 獲取有關文件的信息
  • 建立文件
在Java中,我們可以使用File類別的createNewFile()方法來建立一個檔案。如果檔案已創建,則此方法傳回true ;如果檔案已存在, 則傳回false 。
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
   // an object of file class
   File f=new File("demo.txt");
   // creating a new file
   Boolean result=f.createNewFile();
   if(result)
      System.out.print(f+" created successfully.");
   else
      System.out.format("%s","File cannot be created due to some error.");
 }
}

將資料寫入文件

對文件的寫入操作意味著將資料儲存到文件中。要對檔案執行寫入操作,我們使用write()方法以及FileWriter類別。要關閉流並取得分配的資源,我們必須使用close()方法。
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
     // creating a new file and writing data to a file
     FileWriter fw=new FileWriter("demo.txt");
     String s="Welcome, this is tutorial of Java File Handling.";
     fw.write(s);
     // closing a file
     fw.close();
   }
}

從檔案中讀取

讀取操作意味著存取或檢索文件中儲存的資料。要對檔案執行寫入操作,我們將使用 Scanner 類別以及hasNextLine()nextLine()方法從檔案中擷取資料。要關閉流,我們必須使用close()方法。
import java.io.*;
import java.util.Scanner;
public class FileHandle{
   public static void main(String []arr) throws IOException{
     File f=new File("demo.txt");
     Scanner sc=new Scanner(f);
     while(sc.hasNextLine())
     {
       String str=sc.nextLine();
       System.out.println(str);
     }
     // closing a file
     sc.close();
   }
}

刪除文件

在處理Java檔案時,我們可以使用File類別的delete()方法來刪除檔案。無需使用close()函數關閉文件,因為FileWriterScanner類別不用於刪除檔案。
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
      File f=new File("demo.txt");
      Boolean result=f.delete();
      if(result)
         System.out.print(f+" deleted successfully.");
      else
         System.out.format("%s","File cannot be deleted due to some error.");
   }
}

獲取有關文件的信息

Java 中有多種方法可以獲得有關文件的資訊。它們之前已經在文件類別的方法中提到過。
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
     File file=new File("demo.txt");
     file.createNewFile();
     String filename=file.getName();
     System.out.println("File Name is "+filename);
     System.out.println("Absolute path of "+filename+" : "+file.getAbsolutePath());
     System.out.print("length of "+filename+" : "+file.length());
     System.out.println("Is "+filename+" readable? "+file.canRead());
     System.out.println("Is "+filename+" writable? "+file.canWrite());
     System.out.println("Is "+filename+" exists? "+file.exists());
  }
}
讓我們來看看一個 Java 程式的操作,該程式在處理 Java 檔案時使用位元組數組流來確定數字是偶數還是奇數。為了寫這個程序,我們將使用java.io套件中的ByteArrayInputStream類別。此類別包含一個緩衝區,用於將位元組數組讀取為輸入流。下面是檢查數字是偶數還是奇數的程式碼。
import java.io.*;
public class FileHandle{
   public static void main(String []arr) throws IOException{
     byte []buffer={10,40,81,23,32,100,57};
     ByteArrayInputStream by=new ByteArrayInputStream(buffer);

     int character=0;
     while((character=by.read())!=-1)
     {
        int number=character;
        if(number%2==0)
          System.out.println(number+" is an even number.");
        else
          System.out.println(number+" is an odd number.");
     }
   }
}
我希望這裡提供的資訊對您有用。為了更好地理解在 Java 中使用文件,您應該嘗試自己實作所有文件和操作方法。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION