Java Multithreading- 동기 블록
Java 동기화 된 블록은 동기화 된 메소드 또는 코드 블록을 표시하는 데 사용됩니다. Java 동기화 블록은 경쟁을 피하는 데 사용됩니다. 이 기사는 다음 내용을 소개합니다.
Java 동기화 된 키워드 (동기화)
Java의 동기화 된 블록은 동기화되어 있습니다. 동기화 블록은 Java의 객체에서 동기화됩니다. 객체에 동기화 된 모든 동기화 블록은 하나의 스레드로만 입력 할 수 있으며 동시에 작업을 수행 할 수 있습니다. 동기화 블록에 들어가기 위해 대기하는 다른 모든 스레드는 동기화 블록의 스레드가 종료 될 때까지 차단됩니다.
4 가지 동기화 블록이 있습니다.
위의 동기화 블록은 모두 다른 객체에서 동기화됩니다. 실제로 필요한 동기화 블록은 특정 상황에 따라 다릅니다.
인스턴스 메소드 동기화
동기화 된 예제 방법은 다음과 같습니다.
public synchronized void add (int value) {this.count += value; }
정적 메서드 동기화
정적 메소드 동기화는 인스턴스 메소드 동기화 메소드와 동일하며 동기화 된 키워드도 사용됩니다. Java 정적 메서드 동기화는 다음과 같습니다.
공개 정적 동기화 된 void add (int value) {count += value; }마찬가지로, 여기서 동기화 된 키워드는 Java 에게이 메소드가 동기화되었다고 말합니다.
정적 메소드의 동기화는 메소드가 위치한 클래스 객체의 동기화를 나타냅니다. 클래스는 Java 가상 시스템의 하나의 클래스 객체에만 해당 할 수 있으므로 동일한 클래스에서 하나의 스레드 만 정적 동기화 메소드를 실행할 수 있습니다.
다른 클래스의 정적 동기화 방법의 경우 스레드는 대기하지 않고 각 클래스에서 정적 동기화 메소드를 실행할 수 있습니다. 호출되는 클래스의 정적 동기화 방법에 관계없이 클래스는 동시에 하나의 스레드에 의해서만 실행될 수 있습니다.
인스턴스 방법의 동기 블록
때로는 전체 메소드를 동기화 할 필요가없고 대신 메소드의 일부를 동기화합니다. Java는 메소드의 일부를 동기화 할 수 있습니다.
비동기 Java 방법의 동기화 블록의 예는 다음과 같습니다.
public void add (int value) {synchronized (this) {this.count += value; }}예제는 Java 동기 블록 생성자를 사용하여 동기화 된 코드를 표시합니다. 이 코드는 실행시 동기화 메소드와 동일합니다.
Java 동기 블록 생성자는 괄호 안에 물체를 둘러싸고 있습니다. 위의 예에서, "이것은", 즉 ADD 메소드를 호출하는 인스턴스 자체가 사용됩니다. 동기화 생성자의 괄호로 둘러싸인 물체를 모니터 객체라고합니다. 위의 코드는 모니터 객체 동기화를 사용하고 동기 인스턴스 메소드는 호출 메소드 자체의 인스턴스를 모니터 객체로 사용합니다.
한 번에 동일한 모니터 객체와 동기화 된 Java 메소드에서 하나의 스레드 만 실행할 수 있습니다.
다음 두 가지 예는 그들이 호출하는 인스턴스 객체를 동기화하므로 동기화 된 실행 효과와 동일합니다.
public class myclass {public synchronized void log1 (String msg1, String msg2) {log.writeln (msg1); log.writeln (msg2); } public void log2 (문자열 msg1, String msg2) {synchronized (this) {log.writeln (msg1); log.writeln (msg2); }}}위의 예에서는 한 번에 두 개의 동기화 블록 중 하나에서 하나의 스레드 만 실행할 수 있습니다.
이 인스턴스 객체에서 두 번째 동기화 블록이 동기화되지 않으면 두 가지 메소드를 스레드에 의해 동시에 실행할 수 있습니다.
정적 방법의 동기 블록
위와 마찬가지로 다음은 두 가지 정적 메소드 동기화의 예입니다. 이 메소드는 메소드가 속한 클래스 객체에서 동기화됩니다.
public class myclass {public static synchronized void log1 (String msg1, String msg2) {log.writeln (msg1); log.writeln (msg2); } public static void log2 (문자열 msg1, String msg2) {synchronized (myclass.class) {log.writeln (msg1); log.writeln (msg2); }}}이 두 가지 방법은 동시에 스레드에 의한 액세스를 허용하지 않습니다.
두 번째 동기화 블록이 myclass.class 객체에서 동기화되지 않은 경우 이 두 가지 메소드는 스레드로 동시에 액세스 할 수 있습니다.
Java 동기화 인스턴스
다음 예에서는 두 개의 스레드가 시작됩니다.이 스레드는 카운터 클래스의 동일한 인스턴스의 추가 메소드를 호출합니다. 동기화는 메소드가 속한 인스턴스에 있으므로 하나의 스레드 만 동시에 메소드에 액세스 할 수 있습니다.
공개 클래스 카운터 {long count = 0; public synchronized void add (long value) {this.count += value; }} public class coun 공개 카운터 스레드 (카운터 카운터) {this.count = 카운터; } public void run () {for (int i = 0; i <10; i ++) {counter.add (i); }}} public class 예제 {public static void main (String [] args) {counter counter = new Counter (); Thread Threada = 새 카운터 스레드 (카운터); Thread Threadb = 새 카운터 스레드 (카운터); threada.start (); threadb.start (); }}두 개의 스레드가 생성되었습니다. 그들의 생성자는 동일한 카운터 인스턴스를 나타냅니다. ADD 메소드가 인스턴스 메소드이고 동기화 된 키워드로 표시되므로 Counter.Add 메소드는 인스턴스에서 동기화됩니다. 따라서 한 번에 하나의 스레드만이 메소드를 호출 할 수 있습니다. 다른 스레드는 메소드를 계속 실행하기 전에 첫 번째 스레드가 add () 메소드를 종료 할 때까지 기다려야합니다.
두 스레드가 두 개의 다른 카운터 인스턴스를 참조하면 동시에 add () 메소드를 호출 할 수 있습니다. 이 방법은 다른 객체를 호출하므로 이러한 방법은 다른 객체에서 동기화됩니다. 이 메소드 호출은 차단되지 않습니다. 다음 예에서 볼 수 있듯이 :
공개 클래스 예제 {public static void main (String [] args) {counter counda = new Counter (); 카운터 카운터 = 새로운 카운터 (); Thread Threada = 새로운 카운터 스레드 (Countera); Thread Threadb = 새 카운터 스레드 (카운터); threada.start (); threadb.start (); }}이 두 스레드 인 Threada 및 ThreadB는 더 이상 동일한 카운터 인스턴스를 참조하지 않습니다. 카운터와 카운터의 추가 방법은 그들이 속한 물체에 동기화됩니다. Countera의 ADD 메소드를 호출한다고해서 CounterB의 추가 메소드에 대한 호출이 차단되지 않습니다.
위의 것은 Java 다중 스레드 동기화 블록에 대한 지식에 대한 설명입니다. 우리는 향후 관련 정보를 계속 추가 할 것입니다. 이 사이트를 지원 해주셔서 감사합니다!