文档章节

volatile和synchronized的区别

M
 MarinJ_Shao
发布于 06/25 00:26
字数 738
阅读 10
收藏 0
点赞 0
评论 0

volatile和synchronized的区别

在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型

详情请看:https://baike.baidu.com/item/java内存模型/3399303

导致多线程开发比较困难的点有两点:

  1. 线程之间如何通信:
  • 共享内存:通过读写内存的公共状态进行隐式传递
  • 消息传递:通过wait()/notify()/notifyAll()等方式,通过发送消息进行显示传递
  1. 线程之间如何同步:
  • 在共享内存的并发模型中,同步是显示做的;synchronized
  • 在消息传递的并发模型中,由于消息的发送必须在消息接收之前,所以同步是隐式的。

说明:Java里面所有的实例域、静态域、数组元素都存储在堆内存中的,堆内存是在多线程之间共享的;局部变量、方法、定义参数或者异常处理不会在线程之间共享的。是否共享导致了内存可见性的问题。(多线程读写同一个文件,多读多写同步进行,会导致混乱) 从上图看线程A和线程B什么时候去同步和更新主内存的共享内存都是不确定的,不确定的因素导致线程安全和线程可见性问题。

 这时候引入volatile。
  • 对于申明了volatile的变量在写操作的时候,JVM向处理器发送一条lock前缀的指令,把这个变量所在缓存行的数据写回到系统内存(主内存);
  • 在多处理器的情况下,保证各个处理器缓存一致性的特点,就会实现缓存一致性协议。这里类似分布式情况下的多个数据库数据一致性、原子性。
  • 每个处理器都去主内存中去检测自己本地缓存中的数据是否过期了(地址修改了),若修改了标志数据失效,当处理器对数据修改的时候,会去主内存同步数据到本地内存。 volatile可以做到原子性、可见性。不能保证复合操作的原子性。优点:相对synchronized开销小。

而synchronized:可重入性、互斥性、可见性。基于JVM实现的 以上是简单的实例在javap指令下查看其java编译器生成的字节码(JVM层面操作,所以synchronized没有源码)。 monitorenter和monitorexit分别是进入监视器,退出监视器,类似加锁和解锁。需要进入锁才能执行后面的方法。

本文转载自:

共有 人打赏支持
M
粉丝 0
博文 8
码字总数 2981
作品 0
杭州
程序员
多线程学习笔记(十二)

volatile的作用是使变量在多个线程间可见 1.死循环 public class PrintInfo implements Runnable { } public class Run { PrintInfo printInfo = new PrintInfo();printInfo.printInfo();Sy......

scymore
2016/09/13
43
0
java 里面保留字volatile及其与synchronized的区别

最近在读java并发编程相关的书籍,蚂蚁金服团队的杰作,可以好好把java并发相关的内容好好研究一下 要理解volatile和synchronized的区别,首先还是需要来理解下java的内存模型 java内存模型 ...

十二缸帕萨特
2015/10/09
267
0
Java中volatile和synchronized的比较

1,volatile 它所修饰的变量不保留拷贝,直接访问主内存中的。 在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问...

hello_hp
2017/11/05
0
0
Volatile关键字详解

简介   在java中,每个线程有一块工作内存区,其中存放这被所有线程共享的主内存中变量值的拷贝。当线程执行时,它在自己的工作内存中操作这些变量。为了获取一个共享变量,一个线程先获取...

wangtx
2016/05/11
121
0
多线程并发的解决方案 volatile synchronized notify notifyAll wait关键字分析

1.ThreadLocal用法 在java中,如果一个变量需要被多个线程访问,可以使用volatile来声明它为“易变的”。而假如一个变量要被持有它的某个线程独享,在java中,它可以使用java.lang.ThreadLoc...

陈小扁
2016/03/09
26
0
volatile与synchronized的区别

<h1>(1)volatile与synchronized都具有线程间可见性,但原理不同,这要从线程间共享数据通信的JMM开始说。</h1> 实例是存在堆内存中的,堆内存在线程间共享。局部变量、方法不会在线程间共享...

光之神韵
06/30
0
0
浅谈Java并发编程系列(四)—— 原子性、可见性与有序性

Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的,我们来看下哪些操作实现了这3个特性。 原子性(atomicity): 由Java内存模型来直接保证原子性变量操作...

codershamo
2017/11/29
0
0
java线程同步之volatile

volatile的概念: volatile与synchronized关键字是多线程并发编程中非常重要的知识点,通常被用于修饰变量。相比于synchroinized来说,volatile要轻量很多,执行的成本会更低。原因是volatil...

lotnip
05/24
0
0
Thread、wait、sleep、Synchronized、ThreadLocal介绍

线程的几种状态 1)start方法   start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源。 2)run方...

underA
2016/08/02
26
0
关于Java里面多线程同步的一些知识

# 关于Java里面多线程同步的一些知识 对于任何Java开发者来说多线程和同步是一个非常重要的话题。比较好的掌握同步和线程安全相关的知识将使得我们则更加有优势,同时这些知识并不是非常容易...

欧阳海阳
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
15分钟前
0
0
CentOS 7.4 设置系统字符编码

1.语言变量LANG在 /etc/locale 文件中。 2.可以通过/ect/profile 来修改LC_TYPE 变量的值 添加如下代码 export LC_ALL="zh_CN.GBK" export LANG="zh_CN.GBK" 到profile文件中,变量的可以修改...

qimh
16分钟前
0
0
Kafka相关使用

安装前提,需要有jdk环境,还有zookeeper环境 zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/ zookeeper安装参考:https://www.jianshu.com/p/f7037105db46 kafka的下......

朝如青丝暮成雪
17分钟前
0
0
CentOS7 解决无法使用tab自动补全 tab代码提示

一、前言 对于刚刚开始学习linux的新人来说,linux的一切都显着神秘,只能惊叹于大牛在Linux上行云流水的操作。今天介绍一下在linux中自动补全的功能。 对于新人来说,在不懂得技巧的情况下,...

ziluopao
23分钟前
0
0
redis安装

https://www.cnblogs.com/feijl/p/6879929.html

ghou-靠墙哭
23分钟前
0
0
Spring核心——注解自动装载

从配置上扩展 之前的文章介绍了Spring的IoC容器配置管理方面的详细内容,需要了解的可以从IoC容器的设计模式开始阅读。在介绍基于注解配置的配置之前我们再重复一下在之前提到的基本认识: ...

随风溜达的向日葵
26分钟前
2
0
ElasticSearch学习(8)—— SearchType

Elasticsearch有四种类型的SearchType 1、query and fetch 向索引的所有分片(shard)都发出查询请求,各分片返回的时候把元素文档(document)和计算后的排名信息一起返回。这种搜索方式是最...

叶枫啦啦
28分钟前
0
0
MYSQL备份工具-mysqldump

介绍 mysqldump 是文本备份还是二进制备份 它是文本备份,如果你打开备份文件你将看到所有的语句,可以用于重新创建表和对象。它也有 insert 语句来使用数据构成表。 语法 mysqldump 的语法是...

郭恩洲_OSC博客
30分钟前
0
0
我的第一个go web框架

使用了beego等go web开发框架之后,感觉各种不方便,尤其是在接收参数、和自定义输出的时候,各种难受,定义各种model,这不是找事情嘛??尤其是在角色权限控制的时候我也感觉力不从心。。。...

独坐苔痕但观罗敷
30分钟前
0
0
自动代码生成图形化工具

自动生成Spring代码 https://github.com/EliMirren/Spring-generator 自动生成Vertx https://gitee.com/duhua/vertx-generator...

奋斗的小牛
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部