public static void main(String[] args){
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0; i<10; i++){
System.out.print(i+" ");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0; i<10; i++){
System.out.print(i+" ");
}
}
}).start();
}
输出结果如下:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
伊谢尔伦2017-04-18 10:29:18
동기화 잠금이 없으면 두 스레드는 언급한 교차 인쇄를 갖지 않습니다. 스레드 실행 우선순위는 누가 CPU 리소스를 먼저 획득하는지에 따라 달라집니다. 프로그램에서는 어떤 스레드가 먼저 실행되는지 보장할 수 없습니다. Java 멀티스레딩 지식에 대해 자세히 살펴보겠습니다.
迷茫2017-04-18 10:29:18
설정 수가 너무 적습니다. 100개의 숫자를 설정하면 두 개의 스레드가 교차하는 인쇄 효과를 볼 수 있습니다. (여기서의 교차는 스레드 1이 숫자를 인쇄하고 스레드 2가 즉시 숫자를 인쇄하는 것이 아니라 분할하여 인쇄하는 것입니다. 세그먼트). ;CPU는 리소스를 확보하고 실행합니다. 교차 인쇄를 구현하려는 경우 생산과 소비자의 예입니다.
ringa_lee2017-04-18 10:29:18
스레드의 실행 순서는 불확실합니다. CPU를 점유하는 사람이 실행하게 됩니다. 10개의 숫자 순서는 반드시 자신의 것이 아닙니다. 몇 번 실행하면 다른 결과가 나타납니다. 또한 스레드의 우선순위가 스레드의 실행 순서를 보장할 수는 없습니다. 단지 우선순위가 높은 스레드일수록 CPU 리소스를 얻을 확률이 더 높습니다.
迷茫2017-04-18 10:29:18
으아악
이렇게 하면 상대적으로 명백한 크로스 프린팅 현상을 볼 수 있지만, 실제로 동시성이란 어떤 스레드가 먼저 실행되고 어떤 스레드가
나중에 실행되는지 알 수 없다는 의미이며, 반드시 그런 현상이 발생한다는 의미는 아닙니다. 크로스오버되세요. 과장해서 말하면 두 스레드 각각의 m, n 어셈블리 명령어를 삽입하면
C_{m+n-1}^{min(m,n)}팩토리얼 수준의 실행 시퀀스를 가질 수 있습니다.