logo

Java의 동기화

Java의 동기화는 공유 리소스에 대한 여러 스레드의 액세스를 제어하는 ​​기능입니다.

Java 동기화는 하나의 스레드만 공유 리소스에 액세스하도록 허용하려는 경우 더 나은 옵션입니다.

동기화를 사용하는 이유는 무엇입니까?

동기화는 주로 다음과 같은 용도로 사용됩니다.

  1. 스레드 간섭을 방지합니다.
  2. 일관성 문제를 방지하기 위해.

동기화 유형

동기화에는 두 가지 유형이 있습니다.

  1. 프로세스 동기화
  2. 스레드 동기화

여기서는 스레드 동기화에 대해서만 설명하겠습니다.

스레드 동기화

스레드 동기화에는 상호 배타적 통신과 스레드 간 통신의 두 가지 유형이 있습니다.

  1. 상호 배타적
    1. 동기화된 방법.
    2. 동기화된 블록.
    3. 정적 동기화.
  2. 협력(Java의 스레드 간 통신)

상호 배타적

Mutual Exclusive는 데이터를 공유하는 동안 스레드가 서로 간섭하지 않도록 도와줍니다. 다음 세 가지 방법을 사용하여 달성할 수 있습니다.

  1. 동기화된 방법을 사용하여
  2. 동기화된 블록을 사용하여
  3. 정적 동기화를 사용하여

Java의 잠금 개념

동기화는 잠금 또는 모니터라고 하는 내부 엔터티를 중심으로 구축됩니다. 모든 객체에는 이와 관련된 잠금이 있습니다. 관례적으로, 객체의 필드에 대한 일관된 액세스가 필요한 스레드는 객체에 액세스하기 전에 객체의 잠금을 획득해야 하며, 작업이 끝나면 잠금을 해제해야 합니다.

Java 5부터 java.util.concurrent.locks 패키지에는 여러 잠금 구현이 포함되어 있습니다.

동기화 없이 문제 이해

이 예에서는 동기화가 없으므로 출력이 일관되지 않습니다. 예를 살펴보겠습니다:

TestSynchronization1.java

 class Table{ void printTable(int n){//method not synchronized for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } class mythread1 extends thread{ table t; mythread1(table t){ this.t="t;" public void run(){ t.printtable(5); mythread2 mythread2(table t.printtable(100); testsynchronization1{ static main(string args[]){ obj="new" table(); only one object t1="new" mythread1(obj); t2="new" mythread2(obj); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 100 10 200 15 300 20 400 25 500 </pre> <h3>Java Synchronized Method</h3> <p>If you declare any method as synchronized, it is known as synchronized method.</p> <p>Synchronized method is used to lock an object for any shared resource.</p> <p>When a thread invokes a synchronized method, it automatically acquires the lock for that object and releases it when the thread completes its task.</p> <p> <strong>TestSynchronization2.java</strong> </p> <pre> //example of java synchronized method class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } class mythread1 extends thread{ table t; mythread1(table t){ this.t="t;" public void run(){ t.printtable(5); mythread2 mythread2(table t.printtable(100); testsynchronization2{ static main(string args[]){ obj="new" table(); only one object t1="new" mythread1(obj); t2="new" mythread2(obj); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <h3>Example of synchronized method by using annonymous class</h3> <p>In this program, we have created the two threads by using the anonymous class, so less coding is required.</p> <p> <strong>TestSynchronization3.java</strong> </p> <pre> //Program of synchronized method by using annonymous class class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } public class testsynchronization3{ static void main(string args[]){ final table obj="new" table(); only one object thread t1="new" thread(){ run(){ obj.printtable(5); }; t2="new" obj.printtable(100); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <hr></=5;i++){></pre></=5;i++){></pre></=5;i++){>

Java 동기화 방법

메소드를 동기화됨으로 선언하면 이를 동기화된 메소드라고 합니다.

동기화된 방법은 공유 리소스에 대한 개체를 잠그는 데 사용됩니다.

스레드가 동기화된 메서드를 호출하면 해당 개체에 대한 잠금을 자동으로 획득하고 스레드가 작업을 완료하면 잠금을 해제합니다.

TestSynchronization2.java

 //example of java synchronized method class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } class mythread1 extends thread{ table t; mythread1(table t){ this.t="t;" public void run(){ t.printtable(5); mythread2 mythread2(table t.printtable(100); testsynchronization2{ static main(string args[]){ obj="new" table(); only one object t1="new" mythread1(obj); t2="new" mythread2(obj); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <h3>Example of synchronized method by using annonymous class</h3> <p>In this program, we have created the two threads by using the anonymous class, so less coding is required.</p> <p> <strong>TestSynchronization3.java</strong> </p> <pre> //Program of synchronized method by using annonymous class class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } public class testsynchronization3{ static void main(string args[]){ final table obj="new" table(); only one object thread t1="new" thread(){ run(){ obj.printtable(5); }; t2="new" obj.printtable(100); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <hr></=5;i++){></pre></=5;i++){>

익명 클래스를 이용한 동기화 방법의 예

이 프로그램에서는 익명 클래스를 사용하여 두 개의 스레드를 생성했으므로 코딩이 덜 필요합니다.

TestSynchronization3.java

 //Program of synchronized method by using annonymous class class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } public class testsynchronization3{ static void main(string args[]){ final table obj="new" table(); only one object thread t1="new" thread(){ run(){ obj.printtable(5); }; t2="new" obj.printtable(100); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <hr></=5;i++){>