스레드가 한 번에 하나의 명령문을 완전히 실행하거나 명령문 분할이 수행 될 수 있습니까? 아래 문에서 예를 들어Java : 스레드에서 명령문 실행
:
public void run() {
System.out.println(aString + ": " + ++index);
}
이 가능한 실행 명령은 무엇입니까?
스레드가 한 번에 하나의 명령문을 완전히 실행하거나 명령문 분할이 수행 될 수 있습니까? 아래 문에서 예를 들어Java : 스레드에서 명령문 실행
:
public void run() {
System.out.println(aString + ": " + ++index);
}
이 가능한 실행 명령은 무엇입니까?
아니요, Thread
이 선매 될 경우 보장 할 수 없으므로 진술이 인 경우 을 완료한다고 가정 할 수 없습니다. 실제로 사전 증분 ++index
작업도 중단없이 완료됩니다 (이유는 AtomicInteger
입니다).
가능한 실행 명령을 열거하는 것은 프로그램의 한 실행에서 다른 실행으로 계속 변경 될 수 있으므로 사용하지 않아야합니다 (다른 스레드도 실행 중이라고 가정). 그렇기 때문에 우리는 Lock과 synchronization을 가지고 다중 스레드 코드에 대한 제어력을 향상 시켰습니다.
자세한 내용은 Concurrency을 참조하십시오.
명령 레벨에서 언제든지 거의에서 인터럽트가 발생할 수 있습니다. 예를 들어, 문자열 연결은 새로운 문자열의 구성으로 구성되며, 여러 개의 명령어가 사용됩니다.이 중 하나는 잠재적으로 중단됩니다. 인쇄는 잠재적으로 또 다른 명령이 중단 될 수도 있습니다.
다른 스레드로 동작 모습 완료하기 전에 스레드가 코드의 세그먼트를 실행하고 싶은 경우
동기화 키워드
http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
또는 잠금 및 세마포어을
http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html
코드/문장이 다른 스레드에 의해 중단되지 않을 것이라는 보장은 없습니다. 하지만 당신은 동기화 된 블록을 사용할 수 있습니다 -
public void run()
{
synchronized(this) {
System.out.println(aString+ ": " + ++index);
}
}
이 더 스레드가 인쇄되는 동안 다른 스레드를 방해하려고 없는지 확인합니다.
마지막 진술이 올바르지 않습니다. synchronized 키워드는 다른 스레드가 현재 실행중인 스레드를 인터럽트하지 못하도록하지만 동일한 객체 또는 메소드에서 동기화 된 메소드를 실행하려고 시도하는 다른 모든 스레드를 대신 차단합니다. 여기에서 확인할 수 있습니다. http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – Tyler