Synchronized同步性与可见性
Synchronized是具有同步性与可见性的,那么什么是同步性与可见性呢?
(1)同步性:同步性就是一个事物要么一起成功,要么一起失败,可谓是有福同享有难同当,就像A有10000去银行转5000给身无分文的B,这个事物有两个操作,1.A扣去5000 即剩下10000-5000=5000;2.B增加0+5000=5000;一起成功的情况就是1和2都成功执行,一起失败的情况是,如果A扣除的时候机器刚好坏了,那么事物就应该回滚,不然A就只剩5000,B还是0;这里没写例子
(2).可见性:就是一个线程的操作可以及时被其他线程更新到;要做到线程可见性必须满足两个条件,这里要谈到JMM(java memory model),1.线程的工作内存副本的共享变量要更新到主存,2.其他线程要及时读取主存的共享变量
为了更好理解 我截了个图

以下代码例子 是为了说明可见性的 是没有增加Synchronized 关键字 所以运行结果会出现
result的值为0 或者 result的值为50
大家应该会疑问为什么会出现50? 这是不是代表没有加Synchronized 也可以实现可见性 ,其实没有加Synchronized 并不代表就一定不会出现可见性,只是概率事件
package cs.util;
public class SynchronizedDemo {
private boolean start=false;
private int result=0;
private int count=0;
//读操作
public void write()
{
start=true;
count=10;
}
//写操作
public void read()
{
if(start)
{
result=count*5;
}
System.out.println("result的值为"+result);
}
class ReadWriteThread extends Thread
{
private boolean state=false;
public ReadWriteThread(boolean state)
{
this.state=state;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(state)
{
write();
}
else
{
read();
}
}
}
public static void main(String[] args) {
SynchronizedDemo demo=new SynchronizedDemo();
demo.new ReadWriteThread(true).start();
demo.new ReadWriteThread(false).start();
}
}
如果要每次都实现 result的值为50 怎么办呢? 很简单 就修改两处地方
//读操作
public synchronized void write()
{
start=true;
count=10; } //写操作
public synchronized void read()
{
if(start)
{
result=count*5;
}
这只保证了可见性,我们还要保证先写后读 还要改一个就是
public static void main(String[] args) {
SynchronizedDemo demo=new SynchronizedDemo();
demo.new ReadWriteThread(true ).start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//休眠一下,不要让下面的读操作太快执行
demo.new ReadWriteThread(false).start();
}
那么每次运行结果都会输出 result的值为50 如果觉得有收获就点击 推荐,让更多人快速学习,不懂也可以私信我免费交流
Synchronized同步性与可见性的更多相关文章
- volatile和synchronized实现内存可见性的区别
先看看synchronized实现内存可见性 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性.我们不仅希望防止某个线程正在使用对象状态而另一个 ...
- volatile、Synchronized实现变量可见性的原理,volatile使用注意事项
变量不可见的两个原因 Java每个线程工作都有一个工作空间,需要的变量都是从主存中加载进来的.Java内存模型如下(JMM): 线程访问一个共享的变量时,都需要先从主存中加载一个副本到自己的工作内存中 ...
- 三个线程,ABC 10次(volatile+synchronized(2 synchronized可以保证内存可见性,所以去掉status 的volatile修饰符)
package ThreadABC; public class MyThread extends Thread { public static int status = 0; @Override pu ...
- synchronized内存可见性理解
一.背景 最近在看<Java并发编程实战>这本书,看到共享变量的可见性,其中说到"加锁的含义不仅仅局限于互斥行为,还包括内存可见性". 我对于内存可见性第一反应是vol ...
- Java多线程之内存可见性和原子性:Synchronized和Volatile的比较
Java多线程之内存可见性和原子性:Synchronized和Volatile的比较 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article ...
- synchronized实现可见性
JMM关于synchronized的两条规定: 1)线程解锁前,必须把共享变量的最新值刷新到主内存中 2)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新获取最新的值 ( ...
- 理解java关键字Synchronized(学习笔记)
之前学习了线程的一些相关知识,今天系统的总结下来 目录 1. Java对象在堆内存中的存储结构 2. Monitor管程 3. synchronized锁的状态变换以及优化 4. synchroniz ...
- 基础篇:详解锁原理,volatile+cas、synchronized的底层实现
目录 1 锁的分类 2 synchronized底层原理 3 Object的wait和notify方法原理 4 jvm对synchronized的优化 5 CAS的底层原理 6 CAS同步操作的问题 ...
- 细说Java多线程之内存可见性
编程这些实践的知识技能,每一次学习使用可能都会有新的认识 一.细说Java多线程之内存可见性(数据挣用) 1.共享变量在线程间的可见性 共享变量:如果一个 ...
随机推荐
- Spark 官方文档(4)——Configuration配置
Spark可以通过三种方式配置系统: 通过SparkConf对象, 或者Java系统属性配置Spark的应用参数 通过每个节点上的conf/spark-env.sh脚本为每台机器配置环境变量 通过lo ...
- 用递归调用实现字符串反转(java版)
写一个函数,输入int型,返回整数逆序后的字符串.如:输入123,返回“321”. 要求必须用递归,不能用全局变量,输入必须是一个参数,必须返回字符串. public static String re ...
- http://www.microsoft.com/en-pk/download/details.aspx?id=40762
http://www.microsoft.com/en-pk/download/details.aspx?id=40762
- angularJS绑定数据时自动转义html标签
angularJS在进行数据绑定时默认是会以文本的形式输出,也就是对你数据中的html标签不进行转义照单全收,这样提高了安全性,防止了html标签中的注入攻击,但有些时候还是需要的,特别是从数据库读取 ...
- js array push 添加内容
向数组中天机内容: var array = new Array(); array.push('newItem');
- C#发送邮件异常:根据验证过程,远程证书无效
今天在做发送邮件功能时,开始用qq邮箱和163邮箱都可以正常发送,后再改用我公司的邮箱和smtp时竟然报错了. 异常提示-----"根据验证过程,远程证书无效",后来通过查询资料解 ...
- mysql测试题
MySQL测试题 一.表关系 请创建如下表,并创建相关约束 创建数据库create database school charset utf8; 建表create table class(cid int ...
- Python全栈开发【基础四】
Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...
- ecshop不同样式文章页调用不同文章模板
根据需要,希望不同的文章分类下的文章页有不一样的页面风格.也就是说根据文章分类ID来判断,输出不同的文章页模板. 重点就是文章分类的ID. 打开:article.php,在120多行左右,找到$sma ...
- <css系列>之css--float总结
一.float的历史 float的设计初衷是实现文字环绕效果. 如下图,对图片添加float,文字实现环绕效果. 二.float特性 1.包裹性,表现:收缩.坚挺.隔绝.具有包裹性的属 ...