dam*_*and 8 java multithreading
我正在尝试学习线程,我不明白这个join()方法.
我有一个Thread(ThreadAdd.java),它将1添加到静态int.
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++;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的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);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么大多数时候结果是2但有时它返回1.
das*_*ght 11
您有时看到的原因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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1052 次 |
| 最近记录: |