volatile 与 synchronized

        首先volatile表示易变得,synchronized 表示同步。

        volatile 有人说是轻量级的synchronized ,但其实它只实现了synchronized 的一部分。其作用是确保指令不会因为编译器优化且每次都直接读取主存上的值。

   Java的jvm内存模型中,每个线程都有自己的虚拟机栈,而线程的共享变量会在每个线程本地有一份copy,所以当非volatile 线程共享变量在某个线程做了修改之后,主存中的数据也作出了修改,个人认为这两个动作应该是原子级别的,不然即使是volatile 也没有作用。而当另外一个线程读取这个线程共享变量时,读取到的可能(这里不是绝对的)仍然是本地的copy,这是就会出现线程共享变量不一致的问题。加上volatile 的作用就会让线程每次都从主存中读取变量,一保证各个线程读取变量的一致性。

 理论上,多线程共享变量应该加上volatile。

synchronized 是保证线程安全的,多个线程调用synchronized,同时只能有一个线程调用,保证线程安全。

所以,当一段代码有synchronized 的话,就没有必要使用volatile了。

就拿线程计数器来说,

一、

public void ThreadTest  extends Thread

{

       public static int count=0;

       public void run()

     {

                 add();

     }

    synchronized public add()

    {

                count++;

    }

   public static void main(String[] args)

   {

             for(int i=0;i<10;i++)

                  {

                          ThreadTest test=new ThreadTest();

                          test.start();

                  }

             System.out.println("the thread counts is:"+ThreadTest.count);

   }

}

这个输出的结果是10;


二、

public void ThreadTest  extends Thread

{

       public static volatile int count=0;

       public void run()

     {

                 add();

     }

    public add()

    {

                count++;

    }

   public static void main(String[] args)

   {

             for(int i=0;i<10;i++)

                  {

                          ThreadTest test=new ThreadTest();

                          test.start();

                  }

             System.out.println("the thread counts is:"+ThreadTest.count);

   }

}

    这个输出结果就不一定是10了。

综上所述,volatile 是保证多线程之间共享变量的一致性,synchronized 保证多线程各个线程之间同步,即有序的。


你可能感兴趣的:(volatile 与 synchronized)