java - volatile中i++的原子性问题
怪我咯
怪我咯 2017-04-18 10:52:11
0
3
718
/**
 * @create on 17/3/27
 * @description
 */
public class Main {
    static volatile int i = 0;
    public static class PlusTask implements Runnable{
        @Override
        public void run(){
            for(int k=0; k<10000; k++)
                i++;
        }
    }

    public static void main(String[] args) throws InterruptedException{
        Thread[] threads = new Thread[10];
        for(int i=0;i<10;i++){
            threads[i] = new Thread(new PlusTask());
            threads[i].start();
        }

        for(int i=0;i<10;i++){
            threads[i].join();
        }

        System.out.println(i);
    }
}

请教各位大牛 为什么这里的输出总是小于10000? 已经调用了thread.join

怪我咯
怪我咯

走同样的路,发现不同的人生

membalas semua(3)
Peter_Zhu

Anda mungkin memerlukan ini:

public void run() {
            for (int k = 0; k < 10000; k++)
                synchronized (Main.class) {
                    i++;
                }
        }

atau takrifkan AtomicInteger

  • Meruap hanya memainkan peranan dalam ketekalan cache berbilang benang dan tidak menjamin bahawa hanya satu utas akan menulis pembolehubah pada satu masa.

Ty80

volitile tidak menjamin atomicity

刘奇

Masalah pembolehubah yang dikongsi dalam operasi berbilang benang Volitale tidak dapat menjamin keatoman operasi komposit, yang bermaksud bahawa utas terakhir tidak boleh sentiasa melihat nilai diubah suai pada utas sebelumnya 🎜>

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan