JavaRush /Java Blog /Random-KO /커피 브레이크 #171. 동기화 키워드를 사용하는 방법. Java에서의 파일 처리

커피 브레이크 #171. 동기화 키워드를 사용하는 방법. Java에서의 파일 처리

Random-KO 그룹에 게시되었습니다

동기화 키워드를 사용하는 방법

출처 : Medium 오늘은 자바 프로그래밍 언어에서 동기화 키워드를 어떤 경우에, 어떻게 올바르게 사용하는지 배워보겠습니다. 커피 브레이크 #171.  동기화 키워드를 사용하는 방법.  Java의 파일 처리 - 1수정자는 변수, 메소드 또는 클래스의 특성을 변경하고 해당 범위를 제한할 수 있는 Java에 존재하는 특정 키워드입니다. Java 언어에는 상당히 많은 수식어 세트가 있습니다. Java의 수정자는 액세스 수정자 액세스 수정자의 두 가지 유형으로 나뉩니다 .

액세스 권한이 없는 수정자

액세스할 수 없는 수정자는 클래스, 메소드 또는 변수의 특성에 대한 정보를 JVM에 제공합니다. Java에는 7가지 유형의 비액세스 한정자가 있습니다.
  • 결정적인
  • 공전
  • 추상적인
  • 동기화됨
  • 휘발성 물질
  • 과도 현상
  • 토종의
이번 글에서는 동기화 키워드 에 대해 자세히 살펴보겠습니다 . 먼저, 언제 어디서 사용할지 정의해 보겠습니다.

동기화는 어떤 경우에 사용되나요?

Java에서 동기화 키워드는 메소드나 코드 블록에 대한 액세스 제어를 제공하는 데 사용됩니다. 스레드가 동기화된 메서드나 코드 블록을 실행하려고 하면 먼저 잠금을 획득해야 합니다. 잠금을 받으면 실행을 시작할 수 있습니다. 그러나 동일한 동기화된 메서드나 코드 블록을 실행하려고 시도하는 다른 스레드는 첫 번째 스레드가 잠금을 해제할 때까지 차단됩니다. 이렇게 하면 한 번에 하나의 스레드만 코드를 실행할 수 있으며 이는 데이터 무결성을 유지하는 데 중요합니다. 동기화된 키워드는 정적 및 비정적 메서드는 물론 코드 블록에도 사용할 수 있습니다.
  • 정적 메서드 와 함께 사용하면 모든 스레드가 동일한 잠금을 위해 경쟁합니다. 이는 성능에 영향을 미칠 수 있으므로 꼭 필요한 경우가 아니면 정적 메서드를 동기화하지 않는 것이 가장 좋습니다.

  • 비정적 메서드 와 함께 사용하면 클래스의 각 인스턴스에 자체 잠금이 있으므로 여러 스레드가 서로 다른 인스턴스에서 동기화된 코드를 동시에 실행할 수 있습니다. 이는 일반적으로 선호되는 접근 방식입니다.

  • 코드 블록 과 함께 사용하면 동기화된 문 으로 전달되는 개체에 대한 잠금이 획득됩니다 . 이를 통해 여러 스레드가 서로 다른 개체의 동기화된 코드 블록을 동시에 실행할 수 있습니다.

따라서 동기화된 키워드는 Java 애플리케이션에서 동시 데이터 액세스를 제어하는 ​​강력한 도구입니다. 올바르게 사용하면 데이터 무결성을 보장하고 성능을 향상시키는 데 도움이 될 수 있습니다.

사용 예

1. 동기화된 블록

public class Counter {
  private int count = 0;

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

  public void increment() {
    synchronized (this) {
      count++;
    }
  }
}
여기에는 카운터에 액세스하는 두 개의 코드 블록이 있습니다. 이들 중 가장 간단한 것은 단순히 값을 읽는 get 메소드입니다. 언뜻 보면 증가 메서드에는 한 줄의 코드가 포함된 것처럼 보입니다. 그러나 증분 연산은 현재 값을 읽고, 여기에 하나를 추가하고, 새 값을 메모리에 다시 써야 한다는 점을 기억하십시오. 즉, 다른 스레드의 중단 없이 수행하려는 세 가지 하위 작업이 있습니다. 예를 들어 반대쪽에 배치하거나 증분 작업을 원자적으로 만드는 것입니다 . 두 개의 코드 블록 앞에 동기화 키워드를 붙일 때 , 예제에서 볼 수 있듯이 특정 객체에 대해 동기화된 것으로 표시한다는 점에 유의하는 것이 중요합니다 . 즉, 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 의 인스턴스인 경우 이러한 메서드를 동기화하면 두 가지 효과가 있습니다.
  • 첫째, 동일한 개체에 대한 동기화된 메서드에 대한 두 호출은 인터리브할 수 없습니다. 한 스레드가 개체에 대해 동기화된 메서드를 실행하면 개체의 동일한 블록에서 동기화된 메서드를 호출하는 다른 모든 스레드는 첫 번째 스레드가 개체에 대한 작업을 마칠 때까지 일시 중지됩니다.

  • 둘째, 동기화된 메서드가 종료되면 동일한 객체에 대한 동기화된 메서드 에 대한 후속 호출에서 자동으로 값을 "이전 발생"으로 설정합니다 . 이렇게 하면 객체 상태의 변경 사항이 모든 스레드에 표시됩니다.

동기화 및 다른 수정자를 사용하는 이유, 방법 및 시기를 아는 것은 경험과 함께 제공되며 경험은 시간과 함께 제공된다는 점을 기억하십시오 .

Java에서의 파일 처리

출처: Usemynotes 이 게시물의 내용은 Java에서의 파일 처리에 관한 것입니다. 파일 처리 작업, File 클래스의 메서드 및 스트림 유형에 익숙해지게 됩니다. 커피 브레이크 #171.  동기화 키워드를 사용하는 방법.  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.* 대신 import java.io.File을 사용할 수도 있습니다 . 이제 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 클래스 메소드

읽을 수 있다()

이 파일 클래스 메서드는 파일을 읽을 수 있는지 확인하고 부울 값, 즉 true 또는 false 를 반환합니다 .

쓸 수 있다()

이는 파일이 쓰기 가능한지 확인하고 부울 값(예: true 또는 false)을 반환하는 파일 클래스 메서드입니다.

존재합니다()

이것은 주어진 파일의 존재를 확인하고 부울 값을 반환하는 데 사용되는 파일 클래스 메서드입니다.

새파일 생성()

새로운 빈 파일을 생성하려면 이 파일 클래스 메소드를 사용하세요. 부울 값을 반환합니다.

삭제()

파일을 삭제하고 부울 값을 반환하는 데 사용되는 파일 클래스 메서드입니다.

getAbsolutePath()

이 메소드는 파일의 절대 경로를 반환하는 데 사용됩니다. 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.");
 }
}

파일에 데이터 쓰기

파일에 대한 쓰기 작업은 파일에 데이터를 저장하는 것을 의미합니다. 파일에 대한 쓰기 작업을 수행하려면 FileWriter 클래스 와 함께 write() 메서드를 사용합니다 . 스트림을 닫고 할당된 리소스를 얻으려면 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();
   }
}

파일에서 읽기

읽기 작업은 파일에 저장된 데이터에 액세스하거나 검색하는 것을 의미합니다. 파일에 쓰기 작업을 수행하기 위해 hasNextLine()nextLine() 메서드 와 함께 Scanner 클래스를 사용하여 파일에서 데이터를 검색합니다. 스트림을 닫으려면 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() 메소드 를 사용하여 파일을 삭제할 수 있습니다 . FileWriterScanner 클래스는 파일을 삭제하는 데 사용되지 않으므로 close() 함수를 사용하여 파일을 닫을 필요가 없습니다 .
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