Java 关键字volatile 与 synchronized 作用与区别

原创 2014年04月13日 23:10:42
1,volatile
    它所修饰的变量不保留拷贝,直接访问主内存中的。
   在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变 量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。 一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程memory中。


2,synchronized

      当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码

     一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

     二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

     三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

     四、当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

     五、以上规则对其它对象锁同样适用.


区别:

  一、volatile是变量修饰符,而synchronized则作用于一段代码或方法。

 二、volatile只是在线程内存和“主”内存间同步某个变量的值;而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。 


Java中volatile的作用以及它和synchronized的比较

volatile不能保证操作的原子性。synchronized可以保证操作的原子性。我认为这是他们最大的区别。 此外 volatile是变量修饰符,而synchronized是要修饰一段代码或者方法...
  • u010473803
  • u010473803
  • 2015-04-16 17:32:40
  • 394

java中关键字volatile的作用; volatile vs synchronized的区别

/** * volatile  * Created by Lovell on 8/3/16. */ public class StoppableTask { /** * 用在多...
  • LANGZI7758521
  • LANGZI7758521
  • 2016-08-03 20:38:21
  • 376

Java并发编程:volatile关键字解析。以及volatile和synchronize的区别

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意...
  • xiaaiwu
  • xiaaiwu
  • 2016-09-03 11:19:51
  • 1385

volatile和synchronized的区别

volatile和synchronized特点首先需要理解线程安全的两个方面:执行控制和内存可见。执行控制的目的是控制代码执行(顺序)及是否可以并发执行。内存可见控制的是线程执行结果在内存中对其它线程...
  • suifeng3051
  • suifeng3051
  • 2016-09-21 18:16:55
  • 11163

synchronized和volatile的区别

volatile与synchronized介绍 volatile是变量修饰符,其修饰的变量具有可见性(可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到物...
  • qiuzhilu
  • qiuzhilu
  • 2016-10-26 23:35:20
  • 408

volatile和synchronized的区别与联系

这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两种关键字来指定三种简单的...
  • vtopqx
  • vtopqx
  • 2013-04-10 12:15:29
  • 6147

Java并发——线程同步Volatile与Synchronized详解

Java面试——线程同步volatile与synchronized详解 0. 前言面试时很可能遇到这样一个问题:使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现线程安全...
  • SEU_Calvin
  • SEU_Calvin
  • 2016-08-30 19:09:16
  • 18080

java 中volatile和synchronize的区别和比较

volatile和synchronize的比较: 1.volatile是线程同步的轻量级实现,所以volatile的性能要比synchronize好;volatile只能用于修饰变量,synchron...
  • shuang1457
  • shuang1457
  • 2016-12-28 10:25:15
  • 626

synchronize和volatile含义,使用

1、使用synchronize修饰的代码块,同一时刻只能有一个线程访问 2、volatile只能保证从堆内存中到子线程的栈内存中,获取的值是最新值,子线程对其操作也只是操作该线程栈中的临时的副本值,...
  • Leven_Martin
  • Leven_Martin
  • 2017-06-26 17:44:06
  • 212

举例解析Java中Volatile的作用

volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。...
  • xilove102
  • xilove102
  • 2016-09-05 09:37:22
  • 3187
收藏助手
不良信息举报
您举报文章:Java 关键字volatile 与 synchronized 作用与区别
举报原因:
原因补充:

(最多只允许输入30个字)