Object의 wait (), notify (), notify All (), Thread의sleep (),join () 및 yield ()
주로 다중 스레드 상황에서 액세스 공유 자원의 사용을 동기화하는 데 사용된다.
wait () 함수를 호출하면 현재 스레드가 대기 상태에 있습니다. notify () 또는 notify All () 방법을 사용하거나 wait () 함수를 호출할 때 시간 초과 타임아웃을 설정하고 시간 초과가 되어야만 이 대상에 막힌 스레드를 깨우고 실행할 수 있습니다.
즉 웨이트 () 또는 notify () 는 대상의 '잠금 표지' 를 조작하고, 웨이트 () 가 실행되면 그 라인은 그 라인이 차지하는 '잠금 표지' 를 방출하여 다른 라인이 같은 대상에 잠긴 synchronized 동기화 함수나 동기화 블록에 접근할 수 있도록 한다.
즉wait()이나 notify()는 주로synchronized 키워드와 함께 사용됩니다.
2.synchronized 키워드
synchronized 키워드에 대한 목적은 동기화 제어를 하는 것이다. 한 라인만 들어갈 수 있고 다른 라인이synchronized 동기화 코드 블록에 접근해야 할 때 이전의 라인이 실행되기를 기다려야 한다. synchronized 동기화 블록을 떠나거나 wait를 호출해야 접근해야 하는synchronized 코드 블록에 들어갈 수 있다.
사용하는 관건은 모든 라인이 같은 대상에 잠겨 있는지 확인하는 것입니다. 그렇지 않으면 서로 다른 대상에 잠겨 있는 여러 라인이synchronized 코드 블록에 접근하는 데 아무런 영향을 주지 않습니다.
그래서 여기 잠긴 대상은 보통 **.class, this 또는 Object 객체에 있습니다.
예를 들면 다음과 같습니다.
2.1 Class 객체에 잠깁니다.
이렇게 하면 다른 루틴은 이 클래스의 다른 정적 synchronized 방법을 호출하거나 synchronized(Foo.class)에 잠긴 코드를 실행할 수 없지만, 이 클래스에 있는 다른 클래스가 아닌 클래스 대상에 잠긴 코드 블록을 호출할 수 있습니다.
public synchronized static void method1() // static
{
//TODO
}
public void method2()
{
synchronized(Foo.class)
}
2.2 this 대상에 잠금
public synchronized void method1() //
{
//TODO
}
public void method2()
{
synchronized(this)
}
2.3 Object 객체와 같은 기타 객체
예:
private Object object1 = new Object();
public void execute(){
synchronized(object1){
//TODO
}
}
2.4 synchronized 동기화 방법과 synchronized 동기화 코드 블록의 차이점:
1)synchronized 동기화 방법은 굵은 입자의 병렬 제어로 어느 순간에 한 라인만 이 synchronized 방법을 실행할 수 있다.
2)synchronized 동기화 코드 블록은 더욱 세밀한 병렬 제어로 이 코드 블록을 잠그고 코드 블록 바깥의 코드는 접근할 수 있다.
3. 자바 JDK5에서 세 가지 방식으로 스레드 안전ThreadLocal,synchronized,Lock을 보장할 수 있다.
3.1 ThreadLocal
공간을 시간으로 바꾸는 전략을 채택하여 모든 라인에 해당하는 복사본을 만든다.
3.2 synchronized
방법이나 코드 블록에서 공유된 접근이 필요한 자원을 동기화 제어할 수 있다.
3.3 Lock
synchronized 방법보다 처리량이 더 좋습니다
synchronized
1) 현대 블록이 동기화되어 기다리지 않으려면 unlock을 진행할 수 있고synchronized는 실현할 수 없습니다.
2) Lock의 성능은 우수하며 경쟁이 치열한 상황에서 더욱 좋은 성능을 제공합니다.
4. Thread의join,sleep,yield4.1join() 방법은 주로 이 라인을 완전히 끝내고 라인이 실행된 후에join() 뒤의 문장을 실행하는 데 사용된다.
public final void join() throws InterruptedException {
VMThread t = vmThread;
if (t == null) {
return;
}
synchronized (t) {
while (isAlive()) {
t.wait();
}
}
}
4.2 sleep()
현재 스레드가 CPU 사용권을 넘겨주고, 일정 시간 동안 실행을 멈추며, 같은 우선순위나 낮은 우선순위 스레드가 실행될 수 있도록 합니다.
4.3 yield()
작용은sleep와 유사하다.
그: 현재 같은 우선순위의 라인이 실행 가능한 상태인지 먼저 검사하고 있으면 CPU의 점유권을 이 라인에 맡긴다. 그렇지 않으면 원래의 라인을 계속 운행한다.
운행 기회는 같은 등급의 다른 라인에 양보되었다.
그러나 다음과 같은 차이점이 있습니다.
1) sleep는 현재 라인을 일정 시간 휴면시킨 후 실행 불가 상태를 진행하고, 내보낸 시간은 프로그램 설정이 가능하며, yield는 설정할 수 없습니다.
2) yield가 실행된 후에도 현재 스레드는 실행 가능한 상태이기 때문에 낮은 우선순위의 스레드가 CPU 사용권을 가져올 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.