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 중국어 웹사이트의 기타 관련 기사를 참조하세요!