volatile和synchronized的区别

原创 2016年09月21日 18:16:55

volatile和synchronized特点

首先需要理解线程安全的两个方面:执行控制内存可见

执行控制的目的是控制代码执行(顺序)及是否可以并发执行。

内存可见控制的是线程执行结果在内存中对其它线程的可见性。根据Java内存模型的实现,线程在具体执行时,会先拷贝主存数据到线程本地(CPU缓存),操作完成后再把结果从线程本地刷到主存。

synchronized关键字解决的是执行控制的问题,它会阻止其它线程获取当前对象的监控锁,这样就使得当前对象中被synchronized关键字保护的代码块无法被其它线程访问,也就无法并发执行。更重要的是,synchronized还会创建一个内存屏障,内存屏障指令保证了所有CPU操作结果都会直接刷到主存中,从而保证了操作的内存可见性,同时也使得先获得这个锁的线程的所有操作,都happens-before于随后获得这个锁的线程的操作。

volatile关键字解决的是内存可见性的问题,会使得所有对volatile变量的读写都会直接刷到主存,即保证了变量的可见性。这样就能满足一些对变量可见性有要求而对读取顺序没有要求的需求。

使用volatile关键字仅能实现对原始变量(如boolen、 short 、int 、long等)操作的原子性,但需要特别注意, volatile不能保证复合操作的原子性,即使只是i++,实际上也是由多个原子操作组成:read i; inc; write i,假如多个线程同时执行i++volatile只能保证他们操作的i是同一块内存,但依然可能出现写入脏数据的情况。

在Java 5提供了原子数据类型atomic wrapper classes,对它们的increase之类的操作都是原子操作,不需要使用sychronized关键字。

对于volatile关键字,当且仅当满足以下所有条件时可使用:

1. 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
2. 该变量没有包含在具有其他变量的不变式中。

volatile和synchronized的区别

  1. volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
  2. volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
  3. volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
  4. volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
  5. volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

如果想更好地理解这两个关键字的作用,强烈建议看一下这篇文章:Java内存模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/suifeng3051/article/details/52611233

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

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

volatile和synchronized的区别与联系

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

volatile 与 synchronized 区别

在Java中,为了保证多线程读写数据时保证数据的一致性,可以采用两种方式: 同步 如用synchronized关键字,或者使用锁对象. volatile 使用volatile关...
  • x2145637
  • x2145637
  • 2017-03-12 13:24:24
  • 225

Java 多线程之 synchronized 和 volatile 的比较

在做多线程并发处理时,经常需要对资源进行可见性访问和互斥同步操作。有时候,我们可能从前辈那里得知我们需要对资源进行 volatile 或是 synchronized 关键字修饰处理。可是,我们却不知道...
  • u013761665
  • u013761665
  • 2016-04-05 09:50:24
  • 4265

synchronized与volatile的区别

Volatile
  • qq_27274997
  • qq_27274997
  • 2017-11-10 16:14:39
  • 56

7、Volatile和synchronized区别、死锁概念

Volatile变量和同步机制synchronized 、lock区别 1、volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此vol...
  • u010796790
  • u010796790
  • 2016-08-08 21:18:03
  • 677

volatile与synchronized的区别

volatile 和 synchronized 的区别
  • hqfok
  • hqfok
  • 2017-06-20 14:43:24
  • 126

synchronized和volatile的区别

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

可能忽略的Java基础知识-小心使用synchronized和volatile

基本概念1.并发编程需要理解几个特性: (1)原子性:不会被打断或破坏的一个或一组操作,原子操作是不能被线程调度机制中断的操作 (2)可见性:写操作对所有的读操作都是立即可见的,例如一个线程中对变...
  • w7849516230
  • w7849516230
  • 2016-05-14 16:52:21
  • 2350

Java中synchronized与volatile的区别与联系

在Java多线程编程中,synchronized是非常常用的关键字,而volatile关键字比较罕见。 从Java 1.5开始,volatile关键字被赋予了新的特性,使其能够实现更轻量级的并发访问控...
  • taiyangdao
  • taiyangdao
  • 2016-05-22 23:52:19
  • 878
收藏助手
不良信息举报
您举报文章:volatile和synchronized的区别
举报原因:
原因补充:

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