이 기사는 동기화 된 자세한 설명의 4 가지 예를 공유합니다.
1. 동기화 된 키워드를 추가할지 여부
공개 클래스 스레드 테스트 {public static void main (string [] args) {예제 = 새 예제 (); 스레드 T1 = 새로운 스레드 1 (예); 스레드 t2 = 새로운 스레드 1 (예); t1.start (); t2.start (); }} class example {public synchronized void gutr () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "excute :" + i); }}} class stread1은 스레드 {private example example; public stread1 (예제 예) {this.example = example; } @override public void run () {example.excute (); }}동기화 된 키워드의 출력 결과는 다음과 같습니다.
0-4 세트가 먼저 출력되고 다음 세트가 출력되고 두 스레드는 순서대로 실행됩니다.
Excute : 0
낙하 : 1
Excute : 2
Excute : 3
낙하 : 4
Excute : 0
낙하 : 1
Excute : 2
Excute : 3
낙하 : 4
동기화 된 키워드의 출력 결과는 다음과 같습니다.
두 개의 스레드는 동시에 동시에 엑스 퓨트 메소드를 실행합니다
Excute : 0
Excute : 0
낙하 : 1
낙하 : 1
Excute : 2
Excute : 2
Excute : 3
Excute : 3
낙하 : 4
낙하 : 4
2. 여러 방법의 멀티 스레딩 상황
공개 클래스 스레드 테스트 {public static void main (string [] args) {예제 = 새 예제 (); 스레드 T1 = 새로운 스레드 1 (예); 스레드 T2 = 새로운 스레드 2 (예); t1.start (); t2.start (); }} class example {public synchronized void gutr () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "excute :" + i); }} public synchronized void gutt1 () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "Excute1 :" + i); }}} class stread1은 스레드 {private example example; public stread1 (예제 예) {this.example = example; } @override public void run () {example.excute (); }} class stread2 strule {private example example; public stread2 (예제) {this.example = example; } @override public void run () {example.excute1 (); }}실행 결과는 다음과 같습니다
동일하게 순서대로 실행되며 다른 스레드가 실행되기 전에 하나의 스레드가 실행됩니다.
Excute : 0
낙하 : 1
Excute : 2
Excute : 3
낙하 : 4
Excute1 : 0
Excute1 : 1
Excute1 : 2
Excute1 : 3
독점 1 : 4
동기화 된 키워드가 제거되면 두 가지 메소드가 동시에 실행되며 상호 영향을 미치지 않습니다.
그러나 예제 서브 루틴에 작성된대로 두 가지 방법조차도 다음과 같습니다.
실행 결과는 항상 한 스레드의 출력과 다른 스레드의 실행입니다.
설명 :
객체에 여러 개의 동기화 된 메소드가 있고 스레드가 특정 순간에 동기화 된 메소드를 입력 한 경우, 다른 스레드는 메소드가 실행되기 전에 객체의 동기화 된 메소드에 액세스 할 수 없습니다.
결론적으로 :
동기화 된 키워드가 메소드를 수정하면 메소드를 동기화 메소드라고합니다.
Java의 각 객체에는 잠금 또는 모니터가 있습니다. 스레드가 객체의 동기화 된 메소드에 액세스하면 객체가 잠그고 다른 스레드는 객체의 동기화 된 메소드에 액세스 할 수 없습니다 (여기서는 동일한 방법이 아닌 모든 동기화 메소드를 나타냅니다). 이전 스레드가 실행 메소드를 완성하거나 예외를 던질 때까지는 객체의 잠금이 해제되어 다른 스레드가 객체의 동기화 된 메소드에 다시 액세스 할 수 있도록합니다.
현재 객체가 잠겨 있습니다. 다른 객체 인 경우 객체간에 제한 관계가 없습니다.
코드에서 두 번째 스레드 객체를 구성하려고 할 때 새 예제 객체가 전달되면 두 스레드의 실행 사이에는 제한이 없습니다.
3. 정적 동기화 방법
동기화 된 키워드 수정 된 메소드가 정적으로 수정되면, 비 정적 동기화 메소드가 객체를 잠그지 만 정적 메소드는 객체에 속하지 않고 클래스에 속하며이 메소드가있는 클래스의 클래스 객체를 잠그게합니다.
공개 클래스 스레드 테스트 {public static void main (string [] args) {예제 = 새 예제 (); 예제 2 = 새 예제 (); 스레드 T1 = 새로운 스레드 1 (예); 스레드 T2 = 새로운 스레드 2 (실시제 2); t1.start (); t2.start (); }} class example {public synchronized static void gutr () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "excute :" + i); }} public synchronized static void gird1 () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "Excute1 :" + i); }}} class stread1은 스레드 {private example example; public stread1 (예제 예) {this.example = example; } @override public void run () {example.excute (); }} class stread2 strule {private example example; public stread2 (예제) {this.example = example; } @override public void run () {example.excute1 (); }}실행 결과는 다음과 같습니다
Excute : 0
낙하 : 1
Excute : 2
Excute : 3
낙하 : 4
Excute1 : 0
Excute1 : 1
Excute1 : 2
Excute1 : 3
독점 1 : 4
정적 수정자가없고 두 개의 스레드가 다른 객체를 통과하면 동시에 동시에 실행됩니다.
따라서 정적 메소드 인 경우 (execute () 및 execute2 ()에 정적 키워드가 추가되어 있다면 다른 예제 객체가 두 스레드로 전달 되더라도 두 스레드는 여전히 서로 제한됩니다. 하나는 먼저 실행 된 다음 다음에 실행해야합니다.
결론적으로 :
동기화 된 메소드가 정적 인 경우 스레드가 메소드에 액세스 할 때 동기화 된 메소드가 위치한 객체가 아니라 동기화 된 메소드가 위치한 클래스에 해당하는 클래스 객체가 잠글 수 있습니다. Java에서는 클래스에 얼마나 많은 개체가 있더라도이 객체는 고유 한 클래스 객체에 해당합니다. 따라서 스레드가 동일한 클래스의 두 객체의 두 개의 정적 및 동기화 된 메소드에 액세스하면 실행 순서도 순차적입니다. 즉, 한 스레드가 메소드를 먼저 실행하고 다른 스레드는 실행이 완료된 후 시작됩니다.
4. 동기화 된 블록
동기화 (객체)
{
}
이는 실행되면 객체 객체를 잠그는 것을 의미합니다. (이 객체는 모든 클래스의 객체가 될 수 있거나이 키워드를 사용할 수 있습니다).
이렇게하면 잠긴 객체를 직접 지정할 수 있습니다.
공개 클래스 스레드 테스트 {public static void main (string [] args) {예제 = 새 예제 (); 스레드 T1 = 새로운 스레드 1 (예); 스레드 T2 = 새로운 스레드 2 (예); t1.start (); t2.start (); }} class example {public void quart () {synchronized (this) {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "excute :" + i); }}} public void gird1 () {synchronized (this) {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "Excute1 :" + i); }}}}}} class stread1은 스레드 {private example example; public stread1 (예제 예) {this.example = example; } @override public void run () {example.excute (); }} class stread2 strule {private example example; public stread2 (예제) {this.example = example; } @override public void run () {example.excute1 (); }}실행 결과는 다음과 같습니다
Excute : 0
낙하 : 1
Excute : 2
Excute : 3
낙하 : 4
Excute1 : 0
Excute1 : 1
Excute1 : 2
Excute1 : 3
독점 1 : 4
예제 프로그램 4 에 의해 달성 된 효과는 예제 프로그램 2의 효과와 동일합니다. 두 스레드는 동시에 대신 순서대로 실행됩니다. 한 스레드가 실행되면 객체 객체가 잠겨 있고 다른 스레드는 해당 블록을 실행할 수 없습니다.
동기화 된 방법은 실제로 메소드의 모든 문을 동기화 된 블록으로 래핑 한 다음 동기화 된 블록의 괄호 안에이 키워드를 전달하는 것과 같습니다. 물론 정적 방법 인 경우 클래스 객체를 잠겨 있어야합니다.
아마도 메소드의 몇 줄만이 스레드 동기화 문제를 포함하므로 동기화 된 블록은 동기화 된 메소드보다 여러 스레드의 액세스를 더 세분화합니다. 동기화 된 블록의 컨텐츠 만 동시에 여러 스레드로 액세스 할 수 없으며,이 방법의 다른 문장은 동시에 동시에 여러 스레드에 의해 액세스 할 수 있습니다 (동기화 된 블록 전후 포함).
결론적으로 :
동기화 된 방법 은 거친 입자 동시 제어입니다. 특정 순간에 하나의 스레드 만 동기화 된 메소드를 실행할 수 있습니다.
동기화 된 블록 은 세분화 된 동시성 제어로 블록의 코드 만 동기화합니다. 방법에 위치하고 동기화 된 블록 이외의 다른 코드는 동시에 여러 스레드로 액세스 할 수 있습니다.
위의 것은 Java 다중 스레드 프로그래밍의 동기화 된 블록 동기화 방법에 관한 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.