输出:
Thread1 Start !!
Thread2 Start !!
Thread2 End !! 100001
Thread1 End !! 100001
我认为输出是{1,10001}或{10000,10001}由于同步...
import java.util.*;
public class Main2 {
public static int shared = 0;
public synchronized static void sharedIncrease(long amount) {
while(amount-->0) shared++;
}
public static void main(String args[]) throws Exception {
StrangeThread t1 = new StrangeThread(100000);
StrangeThread t2 = new StrangeThread(1);
t1.start();
t2.start();
}
}
class StrangeThread extends Thread {
long amount;
int thrdNum;
static int cnt = 1;
StrangeThread(long value) {
amount = value;
thrdNum = cnt++;
}
public void run() {
System.out.println("Thread"+thrdNum+" Start !! ");
Main2.sharedIncrease(this.amount);
System.out.println("Thread"+thrdNum+" End !! "+Main2.shared);
}
}
请考虑以下操作顺序
Thread1 Start !!
Thread2 Start !!
sharedIncrease
中的逻辑(线程2被阻塞)。方法返回时,shared
将为100000。shared
将为100001。Thread2 End !!
Thread1 End !!
在5
和6
点处,shared
的值为100001。(您也可以反转5和6;结果相同)。
关键是线程1在其执行的一部分递增之前无法打印。因此,您会看到相同的结果。