programing

'synchronized'는 무슨 뜻입니까?

bestcode 2022. 8. 21. 19:40
반응형

'synchronized'는 무슨 뜻입니까?

몇 이 있습니다.synchronized키워드를 지정합니다.

  • 의 의의는 무엇입니까?synchronized★★★★★★★★★★★★★★★★★?
  • 요?synchronized
  • 프로그래밍 및 논리적으로 무엇을 의미합니까?

synchronized키워드는 동일한 변수, 객체 및 리소스에 대한 다양한 스레드 읽기 및 쓰기에 관한 것입니다.이것은 Java에서 간단한 주제가 아닙니다만, Sun의 말을 인용하면 다음과 같습니다.

synchronized는 스레드 및 오류를 스레드에 에 대한 쓰기는 메서드를 됩니다.개체가 여러 스레드에 표시되는 경우 해당 개체의 변수에 대한 모든 읽기 또는 쓰기는 동기화된 메서드를 통해 수행됩니다.

간단히 말하면 다음과 같습니다.동일한 '리소스'에 대해 읽고 쓰는 두 개의 스레드가 있는 경우 다음과 같은 변수를 사용합니다.foo이러한 스레드가 아토믹 방식으로 변수에 액세스하는지 확인해야 합니다.synchronized 「1」, 「1」, 「2」로 않을 수 .foo또는 그보다 더 나쁜 것은 절반만 변경될 수 있습니다.이것은 당신이 논리적으로 예상한 것이 아닙니다.

이것은 Java에서는 중요하지 않은 주제입니다.자세한 내용은 SO 및 Interwebs의 다음 토픽을 참조하십시오.

"Brian Goetz"라는 이름이 뇌 속의 "concurrency"라는 용어와 영구적으로 연관될 때까지 이러한 주제들을 계속 탐구하세요.

이론적인 설명은 충분히 들은 것 같아요 그러니 이 코드를 생각해 보세요

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는 이전 스레드의 실행이 완료되지 않는 한 메서드 test()에 대한 다음 스레드의 호출을 차단합니다.스레드는 이 메서드에 한 번에 하나씩 액세스할 수 있습니다.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키워드를 지정하면 여러 스레드에 의해 코드 또는 오브젝트의 블록에 동시에 액세스 할 수 없게 됩니다.의 모든 Hashtablesynchronized한 번에 1개의 스레드만 실행할 수 있습니다.

(非)를 사용하는 synchronized은 construct construct 등의 HashMap일관성 오류를 방지하려면 코드에 스레드세이프티 기능을 구축해야 합니다.

synchronized 스레드 에는 "Multiple Threaded(멀티 스레드가 .synchronizedmethodblock의 스레드가 메서드/block(s)에 하지 않습니다.synchronized코드 메서드/블록(복수)을 동시에 사용할 수 있습니다., 한 개의 다른 스레드는 수 뜻입니다.

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

「」를 해 주세요.synchronized블록은 이점을 제공하지 않습니다.

synchronized키워드를 지정하면 메서드 입력 시 스레드가 잠금을 취득하여 동시에 메서드를 실행할 수 있는 것은1개의 스레드뿐입니다(특정 오브젝트인스턴스에서는 스태틱메서드가 아닌 한).

이것은 종종 수업의 스레드 세이프라고 불리지만, 나는 이것이 완곡한 표현이라고 말하고 싶다.동기화가 벡터의 내부 상태를 손상으로부터 보호하는 것은 사실이지만, 일반적으로 벡터 사용자에게 큰 도움이 되지 않습니다.

다음 사항을 고려하십시오.

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

관련된 메서드는 동기화되어 있어도 개별적으로 잠금 및 잠금 해제되기 때문에 2개의 타이밍이 나쁜 스레드에서는 2개의 요소를 가진 벡터가 작성될 수 있습니다.

따라서 사실상 애플리케이션 코드도 동기화해야 합니다.

메서드 레벨의 동기화는 a)필요없을 때는 비싸고 b)동기화가 필요할 때는 불충분하기 때문에 비동기화된 대체품이 있습니다(Vector의 경우 ArrayList).

최근 동시성 패키지가 출시되었으며 멀티스레딩 문제를 해결하는 여러 가지 영리한 유틸리티가 포함되어 있습니다.

개요

Java의 synchronized 키워드는 스레드 안전, 즉 여러 스레드가 동일한 변수를 읽거나 쓸 때 사용됩니다.
이는 직접(같은 변수에 액세스하여) 또는 간접(같은 변수에 액세스하는 다른 클래스를 사용하여) 발생할 수 있습니다.

synchronized 키워드는 여러 스레드가 같은 변수에 안전하게 접근할 수 있는 코드 블록을 정의하기 위해 사용됩니다.

더 깊이

으로 " " "synchronized는 「」를 합니다.Object파라미터(잠금 오브젝트라고 함)로서, 그 뒤에 다음으로는{ block of code }.

  • 실행 시 이 키워드가 발견되면 현재 스레드는 잠금 오브젝트를 "잠금/획득/소유"(선택)하고 잠금 취득 후 관련 코드 블록을 실행하려고 합니다.

  • 동기화된 코드 블록 내의 변수에 대한 쓰기는 동일한 잠금 객체를 사용하여 동기화된 코드 블록 내의 코드를 유사하게 실행하는 다른 모든 스레드에 대해 볼 수 있습니다.

  • 한 번에 하나의 스레드만 잠금을 유지할 수 있으며, 이 시간 동안 동일한 잠금 개체를 가져오려는 다른 모든 스레드는 대기합니다(실행 일시 중지).실행이 동기화된 코드 블록을 종료하면 잠금이 해제됩니다.

동기화된 메서드:

" " " synchronized메서드 정의에 대한 키워드는 동기화된 코드 블록으로 감싸지는 메서드 본문 전체와 같습니다.this (예를 들어 메서드)ClassInQuestion.getClass() (클래스 메서드의 경우).

없는 입니다.static키워드를 지정합니다.
은 - 클래스 방식입니다. - 방식으로는 - 클래스 메서드가 .static키워드를 지정합니다.

테크니컬

동기화하지 않으면 읽기 및 쓰기가 발생하는 순서가 보장되지 않으므로 변수를 가비지로 남길 수 있습니다.
(를 들어 의 스레드에 다른 스레드에 될 수 는 어느 쓰려고 않은 가 될 수 있습니다).를 클릭합니다.

다른 스레드가 읽기 전에(월클럭 시간) 스레드에서 쓰기 작업을 완료하기에는 충분하지 않습니다. 왜냐하면 하드웨어는 변수의 값을 캐시할 수 있고 읽기 스레드는 기록된 값이 아닌 캐시된 값을 볼 수 있기 때문입니다.

결론

따라서 Java의 경우 스레드 오류가 발생하지 않도록 Java 메모리 모델을 따라야 합니다.
,, 음, 음, 다, 다, 다, in, in, in, in.동기, 원자 조작 또는 후드에서 사용하는 클래스를 사용합니다.

원천

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

축구장에서 볼 수 있는 일종의 회전식이라고 생각하세요.탑승을 원하는 사람들이 나란히 서 있지만 개찰구에서는 '동기화'되어 있습니다.한 번에 한 사람만 통과할 수 있습니다.통과하고 싶은 사람은 모두 통과하지만 통과될 때까지 기다려야 할 수도 있습니다.

synchronized 키워드는 무엇입니까?

스레드는 주로 필드 및 개체 참조 필드가 참조하는 액세스 권한을 공유하여 통신합니다.이러한 형태의 통신은 매우 효율적이지만 스레드 간섭 오류와 메모리 일관성 오류라는 두 가지 유형의 오류가 발생할 수 있습니다.이러한 오류를 방지하기 위해 필요한 도구는 동기화입니다.

동기화된 블록 또는 메서드는 스레드 간섭을 방지하고 데이터의 일관성을 보장합니다.어느 시점에서나 잠금을 취득함으로써 동기화된 블록 또는 메서드(크리티컬 섹션)에 액세스 할 수 있는 것은 1개의 스레드뿐입니다.다른 스레드는 중요한 섹션에 액세스하기 위해 잠금이 해제될 때까지 기다립니다.

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

는 [Manages]를 됩니다.synchronized이치노특정 코드 블록을 메서드와 동기화할 수도 있습니다.

문법적으로 논리적으로 프로가 무슨 뜻이죠?

이는 잠금을 획득하여 하나의 스레드만 중요한 섹션에 액세스할 수 있음을 의미합니다.이 스레드가 잠금을 해제하지 않는 한 다른 모든 스레드는 잠금을 획득하기 위해 기다려야 합니다.잠금장치 없이 중요한 구역으로 들어갈 수 있는 접근권이 없어

이건 마법으로는 할 수 없어응용 프로그램에서 중요한 섹션을 식별하고 그에 따라 보호하는 것은 프로그래머의 책임입니다.Java는 애플리케이션을 보호하기 위한 프레임워크를 제공하지만, 보호되는 모든 섹션은 프로그래머의 책임입니다.

자세한 내용은 Java 문서 페이지를 참조하십시오.

고유 잠금 및 동기화:

동기화는 내부 엔티티(internal lock 또는 monitor lock)를 중심으로 구축됩니다.고유한 잠금은 개체의 상태에 대한 배타적 액세스를 적용하는 것과 가시성에 필수적인 발생 전 관계를 설정하는 두 가지 동기화 측면에서 모두 역할을 합니다.

모든 오브젝트에는 고유의 잠금이 관련되어 있습니다.관례상 오브젝트 필드에 대한 배타적이고 일관된 액세스가 필요한 스레드는 오브젝트 필드에 액세스하기 전에 오브젝트의 본질적인 잠금을 취득한 후 오브젝트 필드가 완료되면 본질적인 잠금을 해제해야 합니다.

나사산은 잠금을 획득한 후 잠금을 해제할 때까지 고유의 잠금을 소유한다고 합니다.스레드가 고유 잠금을 소유하고 있는 한 다른 스레드는 동일한 잠금을 획득할 수 없습니다.잠금을 획득하려고 하면 다른 스레드가 차단됩니다.

스레드에서 본질적인 잠금이 해제되면 해당 액션과 이후 동일한 잠금이 획득되는 사이에 발생 전 관계가 설정됩니다.

메서드를 동기화하면 다음 두 가지 효과가 있습니다.

첫 번째로, 같은 오브젝트상에서 동기화된 메서드의 2개의 호출을 인터리브 할 수 없습니다.

하나의 스레드가 객체에 대해 동기화된 메서드를 실행하는 경우 첫 번째 스레드가 객체에 대해 완료될 때까지 동일한 객체 블록에 대해 동기화된 메서드를 호출하는 다른 모든 스레드(실행 일시 중단)입니다.

둘째, 동기화된 메서드가 종료되면 동일한 오브젝트에 대해 동기화된 메서드의 후속 호출과 open-before 관계를 자동으로 확립한다.

이렇게 하면 개체 상태에 대한 변경 내용이 모든 스레드에 표시됩니다.

에서 동기화를 대체할 다른 방법을 찾습니다.

Java에서 동기화되지 않도록 하시겠습니까?

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
        }
    } 
}

★★★의 synchronizedSynchronized Methods ★★★★★★★★★★★★★★★★★」Synchronized StatementsSynchronized Methods와 유사하다Synchronized Statements 만 하면 .Synchronized Statements.

=> 기본적으로는,

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

이 되는 생각 입니다.synchronized

  • 에는 '/'가 .intrinsic lock관련지어져 있습니다.
  • 가 ""를 synchronized statement됩니다.intrinsic lock 때문에synchronized statement's오브젝트를 지정하고 메서드가 반환되면 해당 오브젝트를 해제합니다.가 「」를 하고 있는 한.intrinsic lock, 다른 스레드는 동일잠금 => 스레드 세이프를 획득할 수 없습니다.

> a = > a 의 athread Asynchronized(this){// code 1}>> > > > > > > > > > > > > > > > > > > > > > >>>>>>>>>>>>>>>>>>>synchronized(this) 모든 「」의 「」를 참조하십시오.synchronized normal method(클래스 내부)가 잠겼기 때문에 잠겨 있습니다.다음에 실행됩니다.thread A1인치).

은 '먹다'와 .synchronized(a variable){// code 1} ★★★★★★★★★★★★★★★★★」synchronized(class)

동일 잠금 => 잠금(어떤 방법에 따라 달라지지 않음)또는 어떤 문장이요?)

동기화된 메서드 또는 동기화된 스테이트먼트를 사용하시겠습니까?

는 는는더 prefer prefer isynchronized statements더 확장성이 높기 때문입니다.예를 들어, 앞으로는 메서드의 일부만 동기화하면 됩니다.예를 들어 동기화된 메서드가 2개 있고 서로 관련이 없지만 스레드가 메서드를 실행하면 다른 메서드가 차단됩니다(사용에 의해 차단될 수 있음).synchronized(a variable)

그러나 동기화된 메서드 적용은 간단하며 코드는 단순해 보입니다., 서로 의내 메서드를 도 있습니다.synchronized method를 더 , 더할 수식하다

메모

(은 별로 가 없다.synchronized비정적)으로 하다

  • 「 」를 사용하는 synchronized method 또는 "normal " 입니다.synchronized(this) ★★★★★★★★★★★★★★★★★」synchronized(non-static variable)각 개체 인스턴스를 기반으로 동기화됩니다.
  • 「 」를 사용하는 synchronized method 또는 "static "synchronized(class) ★★★★★★★★★★★★★★★★★」synchronized(static variable)됩니다.

언급

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

도움이 되었으면 좋겠다

다음은 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 방법들을 두 효과가 즉, 이 방법들을 동기화하면 두 가지 효과가 있습니다.

  • 첫 번째로, 같은 오브젝트상에서 동기화된 메서드의 2개의 호출을 인터리브 할 수 없습니다.하나의 스레드가 객체에 대해 동기화된 메서드를 실행하는 경우 첫 번째 스레드가 객체에 대해 완료될 때까지 동일한 객체 블록에 대해 동기화된 메서드를 호출하는 다른 모든 스레드(실행 일시 중단)입니다.
  • 둘째, 동기화된 메서드가 종료되면 동일한 오브젝트에 대해 동기화된 메서드의 후속 호출과 open-before 관계를 자동으로 확립한다.이렇게 하면 개체 상태에 대한 변경 내용이 모든 스레드에 표시됩니다.

Synchronized는 기본적으로 컴파일러가 monitor.enter와 monitor.exit를 메서드에 따라 작성하는 것을 의미합니다.따라서 사용 방법에 따라 스레드 세이프가 될 수 있습니다(클래스의 동작에 따라 스레드 세이프가 아닌 동기 메서드로 오브젝트를 쓸 수 있습니다).

다른 답변이 누락된 것은 중요한 측면 중 하나입니다. 바로 기억의 장벽입니다.스레드 동기화는 기본적으로 직렬화와 가시성의 두 부분으로 구성됩니다.jvm 메모리 장벽은 중요하지 않고 매우 중요한 주제이기 때문에 모두에게 구글 검색을 권장합니다(여러 스레드에 의해 액세스되는 공유 데이터를 수정하는 경우).이를 통해 명시적 동기화를 사용하지 않도록 하는 java.util.current 패키지의 클래스를 살펴보는 것이 좋습니다.이러한 클래스는 프로그램을 단순하고 효율적으로 유지하고 교착 상태를 방지할 수 있습니다.

예를 들어 ConcurrentLinkedDeque가 있습니다.명령어 패턴과 함께 명령어를 동시 큐에 채움으로써 매우 효율적인 워커 스레드를 작성할 수 있습니다.명시적인 동기, 데드록, 명시적인 sleep()은 필요 없습니다.take()를 호출하여 큐를 폴링하기만 하면 됩니다.

즉, "메모리 동기화"는 스레드를 시작할 때, 스레드가 종료될 때, 휘발성 변수를 읽을 때, 모니터의 잠금을 해제할 때(동기화된 블록/함수를 남길 때) 암묵적으로 발생합니다.이 "동기화"는 특정 작업 전에 수행된 모든 쓰기에 영향을 줍니다(어떤 의미에서는 "플래시").상기 Concurrent Linked Deque의 경우 매뉴얼은 다음과 같습니다.

메모리 일관성 효과:다른 동시 컬렉션과 마찬가지로 오브젝트를 ConcurrentLinkedDeque에 배치하기 전 스레드 내의 액션은 다른 스레드의 ConcurrentLinkedDeque에서 해당 요소를 액세스 또는 삭제하기 전에 발생합니다.

이 암묵적인 동작은 경험이 많지 않은 대부분의 Java 프로그래머들이 이 동작으로 인해 주어진 대로 많은 것을 받아들이기 때문에 다소 치명적인 양상입니다.그리고 Java가 작업 부하가 다른 프로덕션 환경에서 "상정된" 작업을 수행하지 않은 후 갑자기 이 스레드에 문제가 발생합니다. 동시성 문제를 테스트하는 것은 매우 어렵습니다.

Synchronized(동기화)란 단순히 단일 객체와 관련된 여러 스레드를 통해 동기화된 블록을 특정 객체에 사용할 경우 읽기 및 쓰기가 더러워지는 것을 방지할 수 있음을 의미합니다.보다 알기 쉽게 하기 위해 예를 들어 보겠습니다.

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();
    }
}

2개의 My Runnable 클래스 오브젝트를 만들었습니다.이 오브젝트는 스레드1과 공유되는 runnable1과 스레드3 및 runnable2는 스레드2와만 공유됩니다.여기서 t1과 t3이 동기화되지 않고 시작되면 PFB 출력은 스레드1과 3이 동시에 var 값에 영향을 주는 것을 나타냅니다.이 경우 스레드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

Synchronized를 사용하면 스레드3은 모든 시나리오에서 스레드1의 완료를 기다립니다.취득한 잠금은 스레드1과 스레드3에 의해 공유되는 runnable1과 스레드2에만 공유되는 runnable2의 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

에서는 여러 변수를 하기 위해 합니다.synchronized키워드를 지정합니다.다음 예제의 도움을 받아 이해하겠습니다.

이 예에서는 두 개의 스레드를 정의하고 증분 및 감소라는 이름을 붙였습니다.시킵니다.counter)은하는 양만큼 즉, + 0= 5000 - 가 됩니다은 감소 스레드가 감소하는 양만큼 감소합니다. 즉, 증가하면 5000배(결과 5000 + 0 = 5000)가 되고 감소하면 5000배(결과 5000 - 5000 = 0)가 됩니다.

★★★★★★★★★★★★★★★★★★★★ 없는 synchronized★★★★★★★★★★★★★★★★★★:

class SynchronizationDemo {

    public static void main(String[] args){

        Buffer buffer = new Buffer();                   

        MyThread incThread = new MyThread(buffer, "increment");
        MyThread decThread = new MyThread(buffer, "decrement"); 

        incThread.start();
        decThread.start();  
       
        try {
          incThread.join();
          decThread.join();
        }catch(InterruptedException e){ }

        System.out.println("Final counter: "+buffer.getCounter());
    }
}

class Buffer {
    private int counter = 0; 
    public void inc() { counter++; }
    public void dec() { counter--; } 
    public int getCounter() { return counter; }
}

class MyThread extends Thread {

    private String name;
    private Buffer buffer;

    public MyThread (Buffer aBuffer, String aName) {            
        buffer = aBuffer; 
        name = aName; 
    }

    public void run(){
        for (int i = 0; i <= 5000; i++){
            if (name.equals("increment"))
                buffer.inc();
            else
                buffer.dec();                           
        }
    }
}

만약 우리가 위의 프로그램을 실행하면 버퍼의 값이 같은 양만큼 증가하거나 감소하는 것은 우리가 처음 시작한 값이 될 것이기 때문에 우리는 버퍼의 값이 같을 것으로 예상한다.출력을 나타냅니다.

여기에 이미지 설명 입력

을 몇 각가 조작되었기 에 다른 를 알 수 .counter 공유 시키거나 그 로 할 수 스레드가 정확하게 사용할 수 있는 .synchronized를 붙이기만 주세요.synchronized해 주세요.inc ★★★★★★★★★★★★★★★★★」decBuffer음음음같 뭇매하다

★★★★★★★★★★★★★★★★★★★★의 프로그램synchronized★★★★★★★★★★★★★★★★★★:

// rest of the code

class Buffer {
    private int counter = 0; 
    // added synchronized keyword to let only one thread
    // be it inc or dec thread to manipulate data at a time
    public synchronized void inc() { counter++; }
    public synchronized void dec() { counter--; } 
    public int getCounter() { return counter; }
}

// rest of the code

및 출력:

여기에 이미지 설명 입력

몇 번을 실행해도 0과 같은 출력을 얻을 수 있습니다.

synchronized simple은 2개의 스레드가 동시에 블록/트레이드에 액세스 할 수 없음을 의미합니다.클래스의 블록/메서드가 동기화되어 있다고 하는 것은 한 번에 하나의 스레드만 액세스할 수 있음을 의미합니다.내부적으로 먼저 액세스하려는 스레드는 해당 오브젝트를 잠급니다.이 잠금을 사용할 수 없는 한 다른 스레드는 클래스 인스턴스의 동기화된 메서드/블록에 액세스할 수 없습니다.

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

Object.wait()

Java 동기화

volatile[대략] =>synchronized

synchronized자바 블록 synchronized동일한 오브젝트/클래스를 가진 블록은 단일 스레드로만 실행할 수 있으며 다른 모든 스레드는 대기 중입니다. 하면 이 될 수 요.race condition여러 스레드가 동일한 변수를 업데이트하려고 하는 경우.

Java 5 '''synchronized by by】를 지원함으로써happens-before [대략]

모니터의 잠금 해제(동기화된 블록 또는 메서드 종료)는 동일한 모니터의 후속 잠금(동기화된 블록 또는 메서드 입력) 전에 발생합니다.

는 '하다'입니다.java.util.concurrent

synchronized는 Java 키워드입니다.이 키워드는 메모리 불일치 및 스레드 간섭 오류를 피하기 위해 멀티스레딩 환경에서 관계를 맺기 전에 사용합니다.

언급URL : https://stackoverflow.com/questions/1085709/what-does-synchronized-mean

반응형