Java에서 동기화된 블록은 함수나 메서드의 특정 리소스에 대한 동기화를 수행하는 데 도움이 됩니다. 코드(LOC)가 100라인이고 10라인에 대해서만 동기화를 해야 한다면 동기화된 블록을 사용할 수 있습니다. 동기화는 키워드, 메소드 및 블록으로 사용될 수 있습니다. 이번 튜토리얼에서는 동기화된 블록에 대해 자세히 설명하겠습니다.
무료 소프트웨어 개발 과정 시작
웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등
구문:
동기화 블록의 구문은 아래와 같습니다.
Synchronized( lo) { //statements that have to be synchronized }
여기 lo는 잠금 객체입니다
이미 설명한 것처럼 동기화된 블록은 함수나 메서드의 특정 리소스에 대한 동기화를 수행하는 데 도움이 됩니다. 스레드가 동기화된 블록 내에서 동기화된 라인을 실행해야 하는 경우 위 구문에서 언급된 잠금 개체 lo의 모니터에서 잠금을 획득하는 것이 필수입니다. 한 번에 하나의 스레드만 잠금 개체의 모니터를 얻을 수 있습니다. 각 스레드는 현재 잠금을 보유하고 있는 스레드가 실행을 완료하고 해제할 때까지 기다려야 합니다.
마찬가지로, 동기화 키워드는 한 번에 단 하나의 스레드만 동기화된 블록의 코드 줄을 실행하도록 보장하여 결과적으로 두 개 이상의 스레드가 블록 내에서 공유되는 데이터를 손상시키는 것을 방지합니다.
메서드가 500개의 LOC(코드 라인)로 구성되어 있지만 코드의 중요 섹션(CS)을 보유하는 코드 라인이 20라인만 있다고 가정합니다. 즉, 이 20개의 선은 객체의 상태를 변경하거나 변경할 수 있습니다. 따라서 객체 상태의 변경을 방지하고 다른 스레드가 중단 없이 특정 메서드 내에서 다른 480줄을 실행하도록 하기 위해 이 20줄의 코드 함수에 대해 동기화를 수행할 수 있습니다.
이제 Java의 동기화 블록에 대한 몇 가지 샘플 프로그램을 살펴보겠습니다.
동기화 블록을 구현하는 Java 프로그램
코드:
class Testsmple{ void printTestsmple(int n) { //start of synchronized block synchronized(this) { System.out.println("The output of synchronized block is: "); for( int i=1 ; i<=4 ; i++ ) { System.out.println(n*i); //exception handling try { Thread.sleep(500); } catch(Exception exc) { System.out.println(exc) ; } } } } //end } class T1 extends Thread { Testsmple t; T1(Testsmple t) { this.t=t; } public void run() { t.printTestsmple(10); } } class T2 extends Thread { Testsmple t; T2(Testsmple t) { this.t=t; } public void run() { t.printTestsmple(200); } } public class SyncBlockExample { public static void main(String args[]) { // create only one object Testsmple ob = new Testsmple(); //objects of threads T1 t1=new T1(ob); T2 t2=new T2(ob); //start the threads t1 and t2 t1.start(); t2.start(); } }
출력:
이 프로그램에서는 두 개의 스레드 t1과 t2가 사용되며, 각 스레드에는 동기화된 메서드를 호출하는 printTestsmple 메서드가 있습니다. printTestsmple에 대한 스레드 1 입력은 10이고, 스레드 2 입력은 200입니다. 결과적으로 첫 번째 스레드의 동기화된 블록의 출력은 10, 20, 30, 40임을 알 수 있습니다. 동시에, 스레드 2 동기화 블록의 결과는 200, 400, 600, 800입니다. 또한 각 스레드의 결과 사이에 인쇄되는 "동기화 블록의 출력은 다음과 같습니다."라는 줄이 있습니다.
익명 클래스를 사용하여 동기화된 블록을 구현하는 Java 프로그램
코드:
class Testsmple{ void printTestsmple(int n) { //start of synchronized block synchronized(this) { System.out.println("The output of synchronized block is: "); for( int i=1 ; i<=4 ; i++ ) { System.out.println(n*i); //exception handling try { Thread.sleep(500); } catch(Exception exc) { System.out.println(exc) ; } } } } //end } public class SyncBlockExample { //main method public static void main(String args[]) { //create only one object final Testsmple obj = new Testsmple() ; //create thread th1 Thread th1=new Thread() { public void run() { obj.printTestsmple(10) ; } } ; //create thread th2 Thread th2=new Thread() { public void run() { obj.printTestsmple(200); } } ; th1.start() ; th2.start() ; }}
출력:
이 프로그램에서도 두 개의 스레드 t1과 t2가 사용되는데, 각 스레드에는 동기화된 메서드를 호출하는 printTestsmple 메서드가 있습니다. printTestsmple에 대한 스레드 1 입력은 10이고, 스레드 2 입력은 200입니다. 결과적으로 첫 번째 스레드의 동기화된 블록의 출력은 10, 20, 30, 40임을 알 수 있습니다. 동시에, 스레드 2 동기화 블록의 결과는 200, 400, 600, 800입니다. 또한 각 스레드의 결과 사이에 인쇄되는 "동기화 블록의 출력은 다음과 같습니다."라는 줄이 있습니다. 유일한 차이점은 이 프로그램에 익명 클래스가 있다는 것입니다.
동기화 블록을 구현하기 위한 Java 프로그램
import java.util.*; class ABC { String nm = ""; public int cnt = 0; public void samplename(String stringexample, List<String>li) { // In order to change the name at a time, only 1 thread is permitted synchronized(this) { nm = stringexample; cnt++; } li.add(stringexample); } } public class SyncBlockExample { //main method public static void main (String[] args) { //create an object for the class ABC ABC obj = new ABC(); //create a list List<String>li = new ArrayList<String>(); //call the method using the object created obj.samplename("Anna Sam", li); System.out.println(obj.nm); } }
출력:
이 프로그램에서는 샘플 이름 메소드 내부에 동기화된 메소드를 사용하여 ABC 클래스가 생성됩니다. 문자열 "Anna Sam"은 메소드 샘플 이름을 호출하기 위한 입력으로 전달됩니다. 코드를 실행하면 "Anna Sam"이라는 문자열이 인쇄됩니다.
몇 가지 장점은 다음과 같습니다.
위 내용은 Java의 동기화된 블록의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!