문제

나는 synchronized 예어.

  • 의 중요성은 무엇입니까 synchronized 예어?
  • 방법은 언제되어야합니다 synchronized?
  • 프로그래밍 방식으로 논리적으로 무엇을 의미합니까?
도움이 되었습니까?

해결책

그만큼 synchronized 키워드는 동일한 변수, 객체 및 리소스에 대한 다른 스레드를 읽고 쓰는 것입니다. 이것은 Java의 사소한 주제가 아니지만 여기에 Sun의 인용문이 있습니다.

synchronized 방법 스레드 간섭 및 메모리 일관성 오류를 방지하기위한 간단한 전략을 가능하게합니다. 객체가 둘 이상의 스레드로 표시되면 해당 객체의 변수를 동기화 된 메소드를 통해 읽거나 씁니다.

아주 작은 간단히 말해서 : 동일한 '리소스'를 읽고 쓰는 두 개의 스레드가있는 경우 이름을 지정하십시오. foo,이 스레드가 원자 방식으로 변수에 액세스하는지 확인해야합니다. 없이 synchronized 키워드, 스레드 1은 변경 스레드 2가 표시되지 않을 수 있습니다. foo, 또는 더 나쁜 것은 절반 만 변경 될 수 있습니다. 이것은 당신이 논리적으로 기대하는 것이 아닙니다.

다시, 이것은 Java에서 사소한 주제입니다. 자세한 내용은 SO와 인터 웹에 관한 주제를 탐색하십시오.

이름이 될 때 까지이 주제를 계속 탐색하십시오 "Brian Goetz" 용어와 영구적으로 연관됩니다 "동시성" 당신의 뇌에.

다른 팁

글쎄, 우리는 이론적 인 설명이 충분하다고 생각 하므로이 코드를 고려하십시오.

public class SOP {
    public static void print(String s) {
        System.out.println(s+"\n");
    }
}

public class TestThread extends Thread {
    String name;
    TheDemo theDemo;
    public TestThread(String name,TheDemo theDemo) {
        this.theDemo = theDemo;
        this.name = name;
        start();
    }
    @Override
    public void run() {
        theDemo.test(name);
    }
}

public class TheDemo {
    public synchronized void test(String name) {
        for(int i=0;i<10;i++) {
            SOP.print(name + " :: "+i);
            try{
                Thread.sleep(500);
            } catch (Exception e) {
                SOP.print(e.getMessage());
            }
        }
    }
    public static void main(String[] args) {
        TheDemo theDemo = new TheDemo();
        new TestThread("THREAD 1",theDemo);
        new TestThread("THREAD 2",theDemo);
        new TestThread("THREAD 3",theDemo);
    }
}

메모: synchronized 이전 스레드의 실행이 완료되지 않은 한 다음 스레드의 메소드 테스트 () 호출을 차단합니다. 스레드는이 방법에 한 번에 하나씩 액세스 할 수 있습니다. 없이 synchronized 모든 스레드는이 방법에 동시에 액세스 할 수 있습니다.

스레드가 객체의 동기화 된 메소드 '테스트'를 호출하면 (여기서 개체는 'THEDEMO'클래스의 인스턴스입니다) 해당 객체의 잠금을 획득하면 새 스레드는 이전 스레드와 동일한 객체의 동기화 된 메소드를 호출 할 수 없습니다. 자물쇠를 얻은 것은 잠금 장치를 방출하지 않습니다.

클래스의 정적 동기화 된 메소드가 호출 될 때도 비슷한 일이 발생합니다. 스레드는 클래스와 관련된 잠금을 획득합니다 (이 경우 해당 객체 레벨 잠금을 사용할 수 있으므로 해당 클래스의 인스턴스의 비 정적 동기화 된 메소드는 모든 스레드에서 호출 할 수 있습니다). 다른 스레드는 클래스 레벨 잠금이 현재 잠금을 보유하는 스레드에 의해 해제되지 않는 한 클래스의 정적 동기화 된 메소드를 호출 할 수 없습니다.

동기화 된 출력

THREAD 1 :: 0
THREAD 1 :: 1
THREAD 1 :: 2
THREAD 1 :: 3
THREAD 1 :: 4
THREAD 1 :: 5
THREAD 1 :: 6
THREAD 1 :: 7
THREAD 1 :: 8
THREAD 1 :: 9
THREAD 3 :: 0
THREAD 3 :: 1
THREAD 3 :: 2
THREAD 3 :: 3
THREAD 3 :: 4
THREAD 3 :: 5
THREAD 3 :: 6
THREAD 3 :: 7
THREAD 3 :: 8
THREAD 3 :: 9
THREAD 2 :: 0
THREAD 2 :: 1
THREAD 2 :: 2
THREAD 2 :: 3
THREAD 2 :: 4
THREAD 2 :: 5
THREAD 2 :: 6
THREAD 2 :: 7
THREAD 2 :: 8
THREAD 2 :: 9

동기화되지 않은 출력

THREAD 1 :: 0
THREAD 2 :: 0
THREAD 3 :: 0
THREAD 1 :: 1
THREAD 2 :: 1
THREAD 3 :: 1
THREAD 1 :: 2
THREAD 2 :: 2
THREAD 3 :: 2
THREAD 1 :: 3
THREAD 2 :: 3
THREAD 3 :: 3
THREAD 1 :: 4
THREAD 2 :: 4
THREAD 3 :: 4
THREAD 1 :: 5
THREAD 2 :: 5
THREAD 3 :: 5
THREAD 1 :: 6
THREAD 2 :: 6
THREAD 3 :: 6
THREAD 1 :: 7
THREAD 2 :: 7
THREAD 3 :: 7
THREAD 1 :: 8
THREAD 2 :: 8
THREAD 3 :: 8
THREAD 1 :: 9
THREAD 2 :: 9
THREAD 3 :: 9

그만큼 synchronized 키워드는 여러 스레드에 의해 코드 또는 객체 블록에 동시에 액세스를 방지합니다. 기본적으로, a Hashtable ~이다 synchronized, 따라서 한 번에 한 번만 테이블에 액세스 할 수 있습니다.

사용 중 non-synchronized 같은 구성 HashMap메모리 일관성 오류를 방지하기 위해 코드에 스레드 안전 기능을 구축해야합니다.

synchronized 멀티 스레드 환경에서 synchronized 메소드/블록 (S)은 두 개의 스레드가 synchronized 동시에 코드의 메소드/블록. 이것은 다른 스레드가 업데이트되는 동안 한 스레드를 읽을 수 없음을 의미합니다.

두 번째 스레드는 대신 첫 번째 스레드가 실행을 완료 할 때까지 기다립니다. 오버 헤드는 속도이지만 이점은 데이터의 일관성을 보장합니다.

그래도 응용 프로그램이 단일 스레드 인 경우 synchronized 블록은 혜택을 제공하지 않습니다.

그만큼 synchronized 키워드는 메소드를 입력 할 때 스레드가 잠금을 얻게되므로 하나의 스레드만이 정적 메소드가 아닌 한 주어진 개체 인스턴스의 경우 메소드를 동시에 실행할 수 있도록합니다.

이것은 종종 클래스 스레드-안전을 만들기라고 불리지만, 이것이 완곡주의라고 말할 것입니다. 동기화가 벡터의 내부 상태가 손상되지 않도록 보호한다는 것은 사실이지만, 일반적으로 벡터 사용자가 많은 도움이되지는 않습니다.

이걸 고려하세요:

 if (vector.isEmpty()){
     vector.add(data);
 }

관련된 방법이 동기화 되더라도 개별적으로 잠금 및 잠금 해제되기 때문에 불행히도 두 개의 타임 스레드가 두 개의 요소가있는 벡터를 생성 할 수 있습니다.

사실상 응용 프로그램 코드에서도 동기화해야합니다.

메소드 레벨 동기화는 a) 필요할 때 비싸고 b) 동기화가 필요할 때 불충분하기 때문에 이제 동기화되지 않은 교체품 (벡터의 경우 배열리스트)이 있습니다.

최근에는 동시성 패키지가 출시되었으며 다중 스레딩 문제를 관리하는 여러 가지 영리한 유틸리티가 출시되었습니다.

개요

Java의 동기화 된 키워드는 스레드 안전성, 즉 여러 스레드가 동일한 변수를 읽거나 쓸 때와 관련이 있습니다.
이는 동일한 변수에 액세스하는 클래스를 사용하는 클래스를 사용하여 직접 (동일한 변수에 액세스 함) 또는 간접적으로 직접 발생할 수 있습니다.

동기화 된 키워드는 여러 스레드가 안전한 방식으로 동일한 변수에 액세스 할 수있는 코드 블록을 정의하는 데 사용됩니다.

더 깊습니다

구문 별 synchronized 키워드는 Object 매개 변수 (호출 잠금 객체), 그 뒤에 a { block of code }.

  • 실행 이이 키워드를 만나면 현재 스레드는 "잠금/획득/소유"(선택)를 시도합니다. 잠금 객체 잠금이 획득 된 후 관련 코드 블록을 실행합니다.

  • 동기화 된 코드 블록 내부의 변수에 대한 쓰기는 동일한 것을 사용하여 동기화 된 코드 블록 내에서 코드를 유사하게 실행하는 다른 모든 스레드에 보장됩니다. 잠금 객체.

  • 한 번에 하나의 스레드만이 잠금을 고정 할 수 있으며, 그 동안 다른 모든 스레드는 동일하게 얻으려고합니다. 잠금 객체 기다릴 것입니다 (실행을 일시 중지). 실행이 동기화 된 코드 블록을 종료하면 잠금이 해제됩니다.

동기화 된 방법 :

첨가 synchronized 메소드 정의에 대한 키워드는 전체 메소드 본체가 동기화 된 코드 블록으로 래핑되는 것과 동일합니다. 잠금 객체 존재 this (예 : 방법) 그리고 ClassInQuestion.getClass() (수업 방법).

- 인스턴스 메소드는 가지고 있지 않은 메소드입니다. static 예어.
- 클래스 메소드는 메소드입니다 static 예어.

전문인

동기화가 없으면 읽기와 쓰기가 발생하는 순서가 보장되지 않아서 변수를 쓰레기로 남겨 두는 것이 보장되지 않습니다.
(예를 들어, 변수는 다른 스레드에 의해 쓴 비트의 한 스레드와 절반의 비트의 절반으로 끝날 수 있으며, 스레드 중 어느 것도 쓰려고 시도하지 않았지만 두 가지의 혼란이 결합 된 상태에 변수를 남깁니다.)

하드웨어가 변수의 값을 캐시 할 수 있었기 때문에 다른 스레드가 읽기 전에 스레드에서 쓰기 작업을 완료하는 것만으로는 충분하지 않습니다. 그것.

결론

따라서 Java의 경우 스레딩 오류가 발생하지 않도록 Java 메모리 모델을 따라야합니다.
즉, 후드 아래에서 귀하를 위해 사용하는 동기화, 원자 연산 또는 클래스를 사용하십시오.

출처

http://docs.oracle.com/javase/specs/jls/se8/html/index.html
Java® 언어 사양, 2015-02-13

축구장에서 찾을 수있는 것처럼 일종의 개찰구로 생각하십시오. 들어가기를 원하는 사람들의 평행 증기가 있지만 개찰구에서는 '동기화'됩니다. 한 번에 한 사람만이 통과 할 수 있습니다. 통과하려는 모든 사람들은 할 것입니다. 그러나 그들은 그들이 통과 할 수있을 때까지 기다려야 할 수도 있습니다.

동기화 된 키워드는 무엇입니까?

스레드는 주로 필드에 대한 액세스를 공유하고 객체 참조 필드를 참조하여 통신합니다. 이 형태의 의사 소통은 매우 효율적이지만 두 가지 종류의 오류가 가능합니다. 스레드 간섭 및 메모리 일관성 오류. 이러한 오류를 방지하는 데 필요한 도구는 동기화입니다.

동기화 된 블록 또는 메소드는 스레드 간섭을 방지하고 데이터가 일관성이 있는지 확인하십시오. 언제든지 하나의 스레드 만 동기화 된 블록 또는 메소드에 액세스 할 수 있습니다 (중요한 섹션) 자물쇠를 얻음으로써. 다른 스레드 (들)는 액세스 할 수있는 잠금이 릴리스되기를 기다립니다. 중요한 섹션.

메소드는 언제 동기화됩니까?

추가 할 때 메소드가 동기화됩니다 synchronized 방법 정의 또는 선언. 메소드와 특정 코드 블록을 동기화 할 수도 있습니다.

문법적으로 그리고 논리적으로 무엇을 의미합니까?

그것은 하나의 스레드 만 액세스 할 수 있음을 의미합니다 중요한 섹션 자물쇠를 얻음으로써. 이 스레드 가이 잠금을 해제하지 않으면 다른 모든 스레드 (들)는 잠금을 얻기 위해 기다려야합니다. 그들은 입장 할 수 없습니다 중요한 섹션 잠금을 얻지 못했습니다.

이것은 마법으로 할 수 없습니다. 식별하는 것은 프로그래머의 책임입니다 임계 섹션 (들) 응용 프로그램에서 그에 따라 보호합니다. Java는 응용 프로그램을 지키기위한 프레임 워크를 제공하지만 모든 섹션이 어디서 지키야하는지는 프로그래머의 책임입니다.

Java 문서의 자세한 내용 페이지

본질적인 잠금 및 동기화 :

동기화는 고유 잠금 또는 모니터 잠금으로 알려진 내부 엔터티 주위에 구축됩니다. 본질적인 잠금 장치는 동기화의 두 측면에서 역할을합니다. 객체의 상태에 대한 독점 액세스를 시행하고 가시성에 필수적인 관계를 확립합니다.

모든 물체에는 그것과 관련된 고유 잠금 장치가 있습니다. 컨벤션에 의해, 객체의 필드에 대한 독점적이고 일관된 액세스가 필요한 스레드는 객체의 고유 잠금 잠금 장치를 액세스하기 전에 획득 한 다음, 본질적인 잠금 장치가 완료 될 때 내장 잠금 장치를 해제해야합니다.

스레드는 자물쇠를 획득 한 시간 사이에 고유 잠금 장치를 소유하고 있다고합니다. 스레드가 고유 잠금 장치를 소유하는 한 다른 스레드는 동일한 잠금을 얻을 수 없습니다. 다른 스레드는 잠금을 얻으려고 할 때 차단됩니다.

스레드가 본질적인 잠금을 풀면 해당 동작과 동일한 잠금의 후속 획득 사이에 관계가 확립됩니다.

메소드를 동기화하는 데는 두 가지가 있습니다 효과:

첫째, 동일한 오브젝트에서 동기화 된 메소드의 두 번의 호출은 인터 리브에 불가능합니다.

한 스레드가 객체에 대한 동기화 된 메소드를 실행하는 경우, 첫 번째 스레드가 객체와 함께 수행 될 때까지 동일한 객체 블록 (SPENTEND EXECUTION)에 대해 동기화 된 메소드를 호출하는 다른 모든 스레드.

둘째, 동기화 된 메소드가 종료되면 동일한 오브젝트에 대한 동기화 된 메소드의 후속 호출과의 관계와의 관계를 자동으로 설정합니다.

이를 통해 객체의 상태 변경이 모든 스레드에 표시됩니다.

동기화에 대한 다른 대안을 찾으십시오.

자바에서 동기화 (이것)을 피하십시오.

다음은 설명입니다 Java 튜토리얼.

다음 코드를 고려하십시오.

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, 그런 다음 이러한 메소드를 동기화시키는 데 두 가지 효과가 있습니다.

  • 첫째, 동일한 오브젝트에서 동기화 된 메소드의 두 번의 호출은 인터 리브에 불가능합니다. 한 스레드가 객체에 대한 동기화 된 메소드를 실행하는 경우, 첫 번째 스레드가 객체와 함께 수행 될 때까지 동일한 객체 블록 (SPENTEND EXECUTION)에 대해 동기화 된 메소드를 호출하는 다른 모든 스레드.
  • 둘째, 동기화 된 메소드가 종료되면 동일한 오브젝트에 대한 동기화 된 메소드의 후속 호출과의 관계와의 관계를 자동으로 설정합니다. 이를 통해 객체의 상태 변경이 모든 스레드에 표시됩니다.

Synchronized normal method 동등합니다Synchronized statement (이것을 사용하십시오)

class A {
    public synchronized void methodA() {
        // all function code
    }

    equivalent to

    public void methodA() {
        synchronized(this) {
             // all function code
        }
    } 
}

Synchronized static method 동등합니다 Synchronized statement (수업 사용)

class A {
    public static synchronized void methodA() {
        // all function code
    }

    equivalent to

    public void methodA() {
        synchronized(A.class) {
             // all function code
        }
    } 
}

동기화 된 명령문 (변수 사용)

class A {
    private Object lock1 = new Object();

    public void methodA() {
        synchronized(lock1 ) {
             // all function code
        }
    } 
}

을 위한 synchronized, 우리는 둘 다 있습니다 Synchronized Methods 그리고 Synchronized Statements. 하지만, Synchronized Methods 비슷하다 Synchronized Statements 그래서 우리는 단지 이해해야합니다 Synchronized Statements.

=> 기본적으로 우리는 가질 것입니다

synchronized(object or class) { // object/class use to provides the intrinsic lock
   // code 
}

다음은 이해를 돕는 데 도움이됩니다 synchronized

  • 모든 객체/클래스에는 an이 있습니다 intrinsic lock 그것과 관련이 있습니다.
  • 스레드가 호출되면 a synchronized statement, 자동으로 획득합니다 intrinsic lock 그에 대한 synchronized statement's 메소드가 반환 될 때 객체를 릴리스합니다. 스레드가 an을 소유하는 한 intrinsic lock, 다른 사람은 없습니다 스레드는 획득 할 수 있습니다 같은 잠금 => 스레드 안전.

=> a thread A 호출 synchronized(this){// code 1} => 모든 블록 코드 (내부 클래스) synchronized(this) 그리고 다 synchronized normal method (내부 클래스)가 잠겨 있습니다 같은 자물쇠. 이후에 실행됩니다 thread A 잠금 해제 ( "// 코드 1"완성).

이 동작은 비슷합니다 synchronized(a variable){// code 1} 또는 synchronized(class).

같은 자물쇠 => 잠금 (어떤 방법에 의존하지 않습니까? 또는 어떤 진술에 의존하지 않습니까?)

동기화 된 메소드 또는 동기화 된 문을 사용 하시겠습니까?

나는 선호한다 synchronized statements 더 확장 가능하기 때문입니다. 예를 들어, 미래에는 메소드의 일부만 동기화되면됩니다. 예를 들어, 2 개의 동기화 된 방법과 IT가 있습니다 아무것도 없습니다 서로 관련이 있지만 스레드가 메소드를 실행하면 다른 방법을 차단합니다 (사용하여 방지 할 수 있습니다. synchronized(a variable)).

그러나 동기화 된 방법을 적용하는 것은 간단하고 코드는 간단하게 보입니다. 일부 클래스의 경우 서로 관련하여 1 개의 동기화 된 방법 또는 클래스의 모든 동기화 된 메소드 만 있습니다 => 우리는 사용할 수 있습니다. synchronized method 코드가 더 짧고 이해하기 쉽게 만듭니다

메모

(그다지 관련이 없습니다 synchronized, 그것은 객체와 클래스의 차이 또는 정적 및 정적 사이에 다릅니다).

  • 당신이 사용할 때 synchronized 또는 정상적인 방법 또는 synchronized(this) 또는 synchronized(non-static variable) 각 객체 인스턴스에서베이스를 동기화합니다.
  • 당신이 사용할 때 synchronized 또는 정적 방법 또는 synchronized(class) 또는 synchronized(static variable) 클래스에 기반을 동기화합니다

참조

https://docs.oracle.com/javase/tutorial/estential/concurrency/syncmeth.html https://docs.oracle.com/javase/tutorial/estential/concurrency/locksync.html

도움이되기를 바랍니다

동기화 된 내 이해는 기본적으로 컴파일러가 모니터를 작성한다는 것을 의미합니다. 따라서 사용 방법에 따라 스레드 안전 할 수 있습니다 (의미는 클래스가하는 일에 따라 스레드 사프가 아닌 동기화 된 메소드가있는 객체를 쓸 수 있다는 것입니다).

다른 답변이 누락 된 것은 중요한 측면 중 하나입니다. 메모리 장벽. 스레드 동기화는 기본적으로 구성됩니다 부품 : 직렬화 및 가시성. 사소하고 매우 중요한 주제 (여러 스레드에서 액세스 한 공유 데이터를 수정하는 경우)이므로 "JVM 메모리 배리어"에 대해 Google에 모든 사람에게 조언합니다. 그렇게 한 후, 나는 명시 적 동기화 사용을 피하는 데 도움이되는 java.util.concurrent 패키지의 클래스를 보는 것이 좋습니다. 이는 프로그램을 간단하고 효율적으로 유지하는 데 도움이되며 심지어 교착 상태를 방지 할 수도 있습니다.

그러한 예 중 하나는입니다 동시에 린드 데크. 함께 명령 패턴 명령을 동시 대기열에 채워서 고효율 작업자 스레드를 생성 할 수 있습니다. 명시 적 동기화가 필요하지 않음, 교착 상태가 필요 없으며, 명시적인 수면 ()이 필요하지 않으며, queue를 호출하여 대기열을 폴링합니다.

요컨대 : "메모리 동기화"가 발생합니다 암시 적으로 스레드를 시작하면 스레드가 종료되면 휘발성 변수를 읽고 모니터를 잠금 해제합니다 (동기화 된 블록/기능을 남겨 둡니다) 등. 모두 그 특정 조치 전에 작성된 글입니다. 앞서 언급 한 경우 동시에 린드 데크, 문서화 "":

메모리 일관성 효과 : 다른 동시 컬렉션과 마찬가지로, 객체를 동시에 린드 데크에 넣기 전에 실의 동작 전기적으로 발생합니다 다른 스레드에서 동시에 린드 링크에서 해당 요소의 액세스 또는 제거에 따른 조치.

이 암시 적 행동은 많은 경험이없는 대부분의 Java 프로그래머가 그로 인해 주어진대로 많은 시간이 걸리기 때문에 다소 악의적 인 측면입니다. 그리고 Java가 다른 작업 부하가있는 생산에서 "가정 된"일을하지 않아서이 스레드를 갑자기 우연히 발견했습니다. 동시성 문제를 테스트하기는 매우 어렵습니다.

동기화 된 단순히 단일 객체와 관련된 경우 여러 스레드가 특정 객체에서 동기화 된 블록을 사용하는 경우 더러운 읽기 및 쓰기를 방지 할 수 있음을 의미합니다. 더 명확성을 제공하려면 예를 들어 보겠습니다.

class MyRunnable implements Runnable {
    int var = 10;
    @Override
    public void run() {
        call();
    }

    public void call() {
        synchronized (this) {
            for (int i = 0; i < 4; i++) {
                var++;
                System.out.println("Current Thread " + Thread.currentThread().getName() + " var value "+var);
            }
        }
    }
}

public class MutlipleThreadsRunnable {
    public static void main(String[] args) {
        MyRunnable runnable1 = new MyRunnable();
        MyRunnable runnable2 = new MyRunnable();
        Thread t1 = new Thread(runnable1);
        t1.setName("Thread -1");
        Thread t2 = new Thread(runnable2);
        t2.setName("Thread -2");
        Thread t3 = new Thread(runnable1);
        t3.setName("Thread -3");
        t1.start();
        t2.start();
        t3.start();
    }
}

우리는 두 개의 myrunnable 클래스 객체를 만들었습니다. Runnable1은 Thread 1과 공유되고 Thread 3 & Runnable2는 Thread 2 와만 공유됩니다. 이제 T1 및 T3이 동기화되지 않고 시작되면 PFB 출력은 스레드 1과 3이 스레드 2의 Var 값에 동시에 영향을 미치는 경우 자체 메모리를 갖는다는 것을 시사합니다.

Without Synchronized keyword

    Current Thread Thread -1 var value 11
    Current Thread Thread -2 var value 11
    Current Thread Thread -2 var value 12
    Current Thread Thread -2 var value 13
    Current Thread Thread -2 var value 14
    Current Thread Thread -1 var value 12
    Current Thread Thread -3 var value 13
    Current Thread Thread -3 var value 15
    Current Thread Thread -1 var value 14
    Current Thread Thread -1 var value 17
    Current Thread Thread -3 var value 16
    Current Thread Thread -3 var value 18

Synchronzied를 사용하여 Thread 3은 모든 시나리오에서 스레드 1이 완료되기를 기다리고 있습니다. 실행 1에 의해 공유 된 Runnable1과 스레드 2에서만 공유 된 2 개의 자물쇠가 획득 된 두 개의 자물쇠가 있습니다.

Current Thread Thread -1 var value 11
Current Thread Thread -2 var value 11
Current Thread Thread -1 var value 12
Current Thread Thread -2 var value 12
Current Thread Thread -1 var value 13
Current Thread Thread -2 var value 13
Current Thread Thread -1 var value 14
Current Thread Thread -2 var value 14
Current Thread Thread -3 var value 15
Current Thread Thread -3 var value 16
Current Thread Thread -3 var value 17
Current Thread Thread -3 var value 18

동기화 된 단순은 두 스레드가 블록/메소드에 동시에 액세스 할 수 없음을 의미합니다. 클래스의 블록/방법이 동기화되어 있다고 말하면 한 번에 하나의 스레드 만 액세스 할 수 있습니다. 내부적으로 액세스하려는 스레드는 먼저 해당 객체를 잠그고이 잠금을 사용할 수없는 한 다른 스레드는 해당 클래스 인스턴스의 동기화 된 메소드/블록에 액세스 할 수 없습니다.

참고 다른 스레드는 동기화되지 않도록 정의되지 않은 동일한 객체의 메소드에 액세스 할 수 있습니다. 스레드는 호출하여 잠금을 해제 할 수 있습니다

Object.wait()

Synchronized는 Java의 키워드로, 메모리 불일치 및 스레드 간섭 오류를 피하기 위해 멀티 스레딩 환경에서 관계 전에 발생하는 데 사용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top