并发编程处理实战篇13:volatile和synchronized的区别与联系

news/2024/5/17 15:21:44 标签: volatile, synchronized, JVM

这个可能是最好的对比volatilesynchronized作用的文章了。volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两种关键字来指定三种简单的存取变量的方式。

int i1;                      
int geti1() {
	return i1;
}
 
volatile int i2;                       
int geti2() {
	return i2;
}
 
int i3;         
synchronized int geti3() {
	return i3;
}

geti1()在当前线程中立即获取在i1变量中的值。线程可以获得变量的本地拷贝,而所获得的变量的值并不一定与其他线程所获得的值相同。特别是,如果其他的线程修改了i1的值,那么当前线程获得的i1的值可能与修改后的值有所差别。实际上,Java有一种主内存的机制,使用一个主内存来保存变量当前的正确的值。线程将变量的值拷贝到自己独立的内存中,而这些线程的内存拷贝可能与主内存中的值不同。所以实际当中可能发生这样的情况,在主内存中i1的值为1,线程1和线程2都更改了i1,但是却没把更新的值传回给主内存或其他线程中,那么可能在线程1中i1的值为2,线程2中i1的值却为3。

另一方面,geti2()可以有效的从主内存中获取i2的值。一个volatile类型的变量不允许线程从主内存中将变量的值拷贝到自己的存储空间。因此,一个声明为volatile类型的变量将在所有的线程中同步的获得数据,不论你在任何线程中更改了变量,其他的线程将立即得到同样的结果。由于线程存取或更改自己的数据拷贝有更高的效率,所以volatile类型变量在性能上有所消耗。

那么如果volatile变量已经可以使数据在线程间同步,那么synchroniz


http://www.niftyadmin.cn/n/1554962.html

相关文章

Mysql实战详解2:MySql设置允许远程连接

默认是不支持远程连接的,需要开启相关权限, 如下: mysql> grant all privileges on *.* to root% identified by root with grant option; mysql> flush privileges; 设置允许root用户远程连接!

mysql左右链接有啥区别吗_oracle 左右连接与mysql左右连接区别

ORACLE 连接外连接在oralce里用(+)表示,右连接:select empno,ename,sal,emp.deptno,dept.deptnofrom emp,deptwhere emp.deptno() dept.deptno左连接:select empno,ename,sal,emp.deptno,dept.deptnofrom emp,deptwhere dept.noe…

hive if语句_Spark存储Parquet数据到Hive,对map、array、struct字段类型的处理

Spark存储Parquet数据到Hive,对map、array、struct字段类型的处理​mp.weixin.qq.com利用Spark往Hive中存储parquet数据,针对一些复杂数据类型如map、array、struct的处理遇到的问题?为了更好的说明导致问题的原因、现象以及解决方案&#xf…

Mysql实战详解3:Mysql查看是否使用到索引

mysql数据库创建索引优化之后,在查询时想看下是否使用到索引, 使用执行计划查看: mysql> explain SELECT * FROM tb_userWHERE STATUS=1 limit 0,20; +----+-------------+----------------+------------+------+----------------------+----------------------+-----…

office修复找不到msi_Microsoft Office安装程序找不到ProPlus.WW\ProPlusWW.msi

展开全部解决办法就是重新下载一个完整的32313133353236313431303231363533e78988e69d8331333366306538安装包,也可以在网上单独下载proplusww.msiMicrosoft Office安装程序找不到ProPlus.WW\ProPlusWW.msi的原因是原始的安装程序里面有一个ProPlus.ww文件夹&#x…

ieee754标准_做题学知识(2)之JS 的 Number 的标准IEEE 754

求职要面试,但是等到求职的时候在准备面试的内容就已经晚了。所以出这个做题学知识系列,让大家始终保持对面试的敏感度。希望大家喜欢,有好的题目也欢迎大家关注公众号进行交流。问题第一题let a 111111111111111110000 let b 1111 a b //…

gdbm mysql函数库_GDBM/NDBM使用介绍

GDBM/NDBM使用介绍GDBM - GNU database manager,一套简单的资料库管理函数。gdbm 的常见版本是1.73 ,在大部份的FreeBSD, Linux 系统中皆已提供,若未提供,则可利用搜寻引擎寻找gdbm-1.7.3.tar.gz 或gdbm-1.8.0.tar.gz 并下载&…

Mysql实战详解4:MySQL事务隔离级别

MySQL事务隔离级别: 事务隔离级别脏读不可重复读幻读读未提交(read-uncommitted)是是是不可重复读(read-committed)否是是可重复读(repeatable-read)否否是串行化(serializable)否否否默认事务隔离级别为repeatable-read 可重复读。 一、事务的基本要素(ACID) 1、原…