易失性和同步的区别

时间:2017-03-22 13:41:01

标签: java multithreading synchronization volatile

我已经执行了下面的代码,期望计数为20000.我已经将count声明为volatile,但输出并不是一直都是正确的。

package threading;

public class Demo5 {
    private volatile int count =0;
    public static void main(String[] args){
        Demo5 d = new Demo5();
        d.doWork();
    }

    public void doWork(){
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                for(int i=0; i<10000; i++){
                    count++;
                }

            }
        });
        Thread t2 = new Thread(new Runnable() {
            public void run() {
                for(int i=0; i<10000; i++){
                    count++;
                }

            }
        });
        t1.start();
        t2.start();

        try{
            t1.join();
            t2.join();
        }
        catch (InterruptedException  e) {
            e.printStackTrace();
        }
        System.out.println(count+" is count");
    }
}

后来我尝试将count作为同步方法,将其置于同步方法中,并且它正常工作。

public synchronized void increment(){
        count++;
    }

有人可以告诉我什么时候应该选择volatile以及何时进行同步?

1 个答案:

答案 0 :(得分:1)

使用volatile,您可以在同一个关键部分中包含增量和设置操作。使用volatile,增量和集合将分别受到保护。这意味着一个线程可以递增,然后另一个线程可以递增,然后一个线程可以设置后跟另一个线程,不一定按照它们递增的相同顺序。 synchronized只能协调单个操作; {{1}}可以协调行动序列。