我正在尝试了解线程,但我不了解join()
方法。
我有一个线程(ThreadAdd.java),它向静态int加1。
public class ThreadAdd extends Thread{
public static int count;
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(ThreadAdd.class.getName()).log(Level.SEVERE, null, ex);
}
ThreadAdd.count++;
}
}
在我的
main
方法中,我启动了2个线程: public static void main(String[] args) throws InterruptedException {
ThreadAdd s1 = new ThreadAdd();
ThreadAdd s2 = new ThreadAdd();
s1.start();s2.start();
s1.join();
s2.join();
System.out.println(ThreadAdd.count);
}
我不明白为什么大多数情况下结果是2,但有时返回1。
最佳答案
有时看到1
的原因不是因为join()
无法等待线程完成,而是因为两个线程都试图同时修改值。发生这种情况时,您可能会看到意外的结果:例如,当两个线程都尝试将count
递增为零时,它们都可以读取零,然后将其加1并存储结果。他们两个都将存储相同的精确结果,即1,因此无论等待多长时间,这都是您要看到的结果。
要解决此问题,请在增量附近添加synchronized
,或使用 AtomicInteger
:
public static AtomicInteger count = new AtomicInteger(0);
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(ThreadAdd.class.getName()).log(Level.SEVERE, null, ex);
}
ThreadAdd.count.incrementAndGet();
}
关于java - 线程join()不等待,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28645536/