线程join()不等待

达米安商人

我正在尝试了解线程,但是我不理解该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。

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

您有时看到的原因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();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章