>  기사  >  Java  >  Java 스레드 동기화 정보

Java 스레드 동기화 정보

巴扎黑
巴扎黑원래의
2017-04-15 09:06:071847검색

1、동기화 방식.

public synchronized void save(){}

2、동기화 코드 블록.

synchronized(object){ 
}

3、휘발성 변수를 사용하세요.
휘발성을 사용하여 필드를 수정하는 것은 다른 스레드에 의해 필드가 업데이트될 수 있음을 가상 머신에 알리는 것과 동일하므로 레지스터의 값을 사용하는 대신 필드가 사용될 때마다 다시 계산해야 합니다.

4、재진입 잠금 사용(ReenreantLock)

public void save(int money) {
    lock.lock();
    try {
        account += money;
    } finally {
        lock.unlock();
    }
}

5、ThreadLocal 변수를 사용하면 해당 변수를 사용하는 각 스레드가 변수의 복사본을 얻고 복사본은 서로 독립적입니다. 따라서 각 스레드는 다른 스레드에 영향을 주지 않고 마음대로 변수의 자체 복사본을 수정할 수 있습니다.

6、블로킹 큐 사용(LinkedBlockingQueue 등)

7、원자 변수 사용(AtomicInteger 등)

요약:
동기화됨:
간헐적인 동기화가 있는 경우 동기화가 매우 적합합니다. 그 이유는 컴파일러가 일반적으로 가능한 한 많이 동기화를 최적화하기 때문입니다. 동기화는 JVM 수준에서 구현됩니다. 일부 모니터링 도구를 통해 동기화된 잠금을 모니터링할 수 있을 뿐만 아니라 코드 실행 중에 예외가 발생하면 JVM이 자동으로 잠금을 해제합니다.

ReentrantLock:
ReentrantLock은 시간 제한 동기화, 중단 가능한 동기화(동기화된 동기화는 중단할 수 없음) 등 다양한 동기화를 제공합니다. 리소스 경쟁이 치열하지 않은 경우 성능은 동기화보다 약간 나쁩니다. 그러나 동기화가 매우 집중되면 동기화 성능이 갑자기 수십 배나 떨어질 수 있습니다. 그리고 ReentrantLock은 실제로 정상성을 유지할 수 있습니다. 잠금은 코드를 통해 구현됩니다. 잠금이 해제되도록 하려면 Unlock()을 finally{}에 배치해야 합니다.

Atomic:
덜 강렬한 상황에서는 싱크로나이즈드보다 성능이 살짝 떨어지지만, 강렬한 상황에서는 정상성을 유지할 수 있다. 극심한 상황에서 Atomic의 성능은 ReentrantLock의 성능보다 약 두 배 더 좋습니다.


1、동기화 방식.

public synchronized void save(){}

2、동기화 코드 블록.

synchronized(object){ 
}

3、휘발성 변수를 사용하세요.
휘발성을 사용하여 필드를 수정하는 것은 다른 스레드에 의해 필드가 업데이트될 수 있음을 가상 머신에 알리는 것과 동일하므로 레지스터의 값을 사용하는 대신 필드가 사용될 때마다 다시 계산해야 합니다.

4、재진입 잠금 사용(ReenreantLock)

public void save(int money) {
    lock.lock();
    try {
        account += money;
    } finally {
        lock.unlock();
    }
}

5、ThreadLocal 변수를 사용하면 해당 변수를 사용하는 각 스레드가 변수의 복사본을 얻고 복사본은 서로 독립적입니다. 따라서 각 스레드는 다른 스레드에 영향을 주지 않고 마음대로 변수의 자체 복사본을 수정할 수 있습니다.

6、블로킹 큐 사용(LinkedBlockingQueue 등)

7、원자 변수 사용(AtomicInteger 등)

요약:
동기화됨:
간헐적인 동기화가 있는 경우 동기화가 매우 적합합니다. 그 이유는 컴파일러가 일반적으로 가능한 한 많이 동기화를 최적화하기 때문입니다. 동기화는 JVM 수준에서 구현됩니다. 일부 모니터링 도구를 통해 동기화된 잠금을 모니터링할 수 있을 뿐만 아니라 코드 실행 중에 예외가 발생하면 JVM이 자동으로 잠금을 해제합니다.

ReentrantLock:
ReentrantLock은 시간 제한 동기화, 중단 가능한 동기화(동기화된 동기화는 중단할 수 없음) 등 다양한 동기화를 제공합니다. 리소스 경쟁이 치열하지 않은 경우 성능은 동기화보다 약간 나쁩니다. 그러나 동기화가 매우 집중되면 동기화 성능이 갑자기 수십 배나 떨어질 수 있습니다. 그리고 ReentrantLock은 실제로 정상성을 유지할 수 있습니다. 잠금은 코드를 통해 구현됩니다. 잠금이 해제되도록 하려면 Unlock()을 finally{}에 배치해야 합니다.

Atomic:
덜 강렬한 상황에서는 싱크로나이즈드보다 성능이 살짝 떨어지지만, 강렬한 상황에서는 정상성을 유지할 수 있다. 극심한 상황에서 Atomic의 성능은 ReentrantLock의 성능보다 약 두 배 더 좋습니다.


위 내용은 Java 스레드 동기화 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.