volatile 与 synchronized

本文对比分析了Java中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 保证多线程各个线程之间同步,即有序的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值