Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Volatile和synchronized之间的区别_Java_Multithreading_Synchronization_Volatile - Fatal编程技术网

Java Volatile和synchronized之间的区别

Java Volatile和synchronized之间的区别,java,multithreading,synchronization,volatile,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 vo

我已经执行了下面的一段代码,希望得到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");
    }
}

有人能告诉我什么时候应该使用volatile,什么时候应该使用synchronized吗

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

方法计数是做什么的?这就是打字错误。更正。
public synchronized void increment(){
        count++;
    }