为什么java中的synchronize关键字在没有join()的情况下不起作用



如果我注释t1.join,t2.join,下面的代码不会给出counter=200的结果。这里我假设我们已经将关键字同步到increment((方法,这将允许一个线程进入increment,假设t1被允许,然后t1使计数器为100,然后t1完成,然后t2将得到一个锁,并取已经更新的计数器值100,然后开始从101递增到200,但如果我注释联接方法,那么程序就不工作了预期

我真的很感谢你抽出时间来帮助我理解这个

public class InterthreadExp1 {
private static int counter =0;
public static synchronized void increment() {
counter++;
}
public static void process() {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
increment();
}
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
increment();
}
}
});
t1.start();
t2.start();

/*
* try { t1.join(); t2.join(); } catch (InterruptedException e) {
* e.printStackTrace(); }
*/

}
public static void main(String[] args) {
process();
System.out.println("Couter value "+counter);
}
}

这里如果我们注释掉t1.join和t2.join方法,那么t1线程或t2线程启动并执行增量方法,同时主线程也在完成t1或t2 的操作之前打印计数器值

如果我们取消注释联接语句,那么主方法将等待,直到时间t1和t2线程完成,然后只有主线程将打印计数器值,该值将给我们预期的结果

最新更新