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.共享变量在线程间的可见性 共享变量:如果一个 ...
随机推荐
- PHP之readdir()函数
最近在学习php文件操作的相关知识,记录一下readdir()函数其中的一个要注意的点 1. 在$temp=readdir($handle)函数中 readdir获取的是文件名和$handle中的文件 ...
- svn sync主从同步学习
svn备份的方式有三种: 1svnadmin dump 2)svnadmin hotcopy 3)svnsync. 优缺点分析============== 第一种svnadmin dump是官方推荐 ...
- 复习(1)【Maven】
终于开始复习旧知识了,有输入必然要有输出.输入和输出之间的内化过程尤为重要,在复习的同时,真正把学到的东西积淀下来,加深理解. Maven项目概念与配置 Maven是一个项目管理和综合工具.Maven ...
- github添加ssh方法(windows版)
生成一个新的SSH key 打开 git bash 输入 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 输入一个文件 ...
- powershell批量设置权限
批量设置权限 $acl=get-acl .\demo Get-ChildItem .\Documents -Recurse -Force|Set-Acl -AclObject $acl
- js抛物线动画——加入购物车动效
参考文章:http://www.zhangxinxu.com/wordpress/2013/12/javascript-js-元素-抛物线-运动-动画/ parapola.js /*! * by zh ...
- ffmpeg-20161003[04,05.06]-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...
- Quartz定时任务简单实例
文章纲要: 初步搭建一个由Quartz为引擎集群的定时任务模块,功能为每隔30秒打印一条信息(Hello World!!!) 一.环境 Spring MVC Mevan Quartz 2.2.1 二. ...
- JSP复习整理(五)JavaBean使用表单处理数据
一.先建立用户输入的数据 usingGetparameter.html <!DOCTYPE html> <html> <head> <meta charset ...
- 自定义 URL Scheme 完全指南
本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处. 注意: 自从自定义 URL 的引入,本文 ...