synchronized实现可见性
JMM关于synchronized的两条规定:
1)线程解锁前,必须把共享变量的最新值刷新到主内存中
2)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新获取最新的值
(注意:加锁与解锁需要是同一把锁)
通过以上两点,可以看到synchronized能够实现可见性。同时,由于synchronized具有同步锁,所以它也具有原子性
多线程中程序交错执行时,重排序可能会造成内存可见性问题
接下来我们看一段代码:
/**
* synchronized能够实现原子性(同步)、可见性
*
* @author xuwenjin
*/
public class SynchronizedDemo { //共享变量
private boolean ready = false;
private int result = ;
private int number = ; /**
* 写操作
*/
public void write() {
ready = true; //1.1
number = ; //1.2
} /**
* 读操作
*/
public void read() {
if (ready) { //2.1
result = number * ; //2.2
}
System.out.println("result:" + result);
} //内部线程类
private class WriteReadThread extends Thread { private boolean flag = false; public WriteReadThread(boolean flag){
this.flag = flag;
} @Override
public void run() {
if (flag) {
write();
}else {
read();
}
}
} public static void main(String[] args) {
SynchronizedDemo demo = new SynchronizedDemo();
//启动线程执行写操作
demo.new WriteReadThread(true).start();
//启动线程执行读操作
demo.new WriteReadThread(false).start();
} }
上面的代码可能出现如下执行顺序:
1) 1.1 --> 1.2 --> 2.1--> 2.2 result的值为 (正常情况)
2) 1.1 --> 2.1 --> 2.2 --> 1.2 result的值为 (当写线程执行完1.1之后,读线程开始)
3) 1.2 --> 2.1 --> 2.2 --> 1.1 result的值为 (1.1跟1.2重排序)
4)...
当然由于重排序和线程的交叉执行,还可能出现很多种执行顺序
导致共享变量在线程间不可见的原因:
a、线程的异步执行
b、重排序结合线程交叉执行
c、共享变量更新后的值没有在工作内存与主内存间及时更新
那么如何解决可见性的问题呢?接下来我们的主角出场:synchronized
安全的代码:
/**
* 写操作
*/
public synchronized void write() {
ready = true; //1.1
number = ; //1.2
} /**
* 读操作
*/
public synchronized void read() {
if (ready) { //2.1
result = number * ; //2.2
}
System.out.println("result:" + result);
}
由于synchronized的原子性、可见性,可以完美解决以上说的三点问题。不过读线程和写线程的执行顺序是不定的,所以result的结果仍然会出现6或0。
如何保证线程顺序执行,大家可参考:https://blog.csdn.net/wenxingchen/article/details/78026767
synchronized实现可见性的更多相关文章
- synchronized的可见性理解
之前的时候看<并发编程的艺术>,书中提到dcl写法的单例模式是有问题的,有可能会导致调用者得到一个创建了一半的对象,从而导致报错.修复办法是将单例对象的引用添加volatile进行修饰,禁 ...
- java synchronized实现可见性对比volatile
问题: 大家可以先看看这个问题,看看这个是否有问题呢? 那里有问题呢? public class ThreadSafeCache { int result; public int getResult( ...
- 关于synchronized 影响可见性的问题
问题来自于学习thinking in java的时候的一个示例,先上代码吧 public class StopThread { private static boolean stop = false; ...
- Volatile和Synchronized对可见性和原子性的支持
在学习并发编程的时候,遇见了volatile和synchronized关键字问题,volatile是可以保证可见性,但无法保证原子性,synchronized关键字由于其是加锁机制,肯定是可以保证原子 ...
- synchronized内存可见性理解
一.背景 最近在看<Java并发编程实战>这本书,看到共享变量的可见性,其中说到"加锁的含义不仅仅局限于互斥行为,还包括内存可见性". 我对于内存可见性第一反应是vol ...
- java线程-synchronized实现可见性代码
以下是一个普通线程代码: package com.Sychronized; public class SychronizedDemo { //共享变量 private boolean ready=fa ...
- volatile、Synchronized实现变量可见性的原理,volatile使用注意事项
变量不可见的两个原因 Java每个线程工作都有一个工作空间,需要的变量都是从主存中加载进来的.Java内存模型如下(JMM): 线程访问一个共享的变量时,都需要先从主存中加载一个副本到自己的工作内存中 ...
- 1 Java线程的内存可见性
Java内存的可见性 可见性: 一个线程对共享变量的修改,能够及时被其它线程看到 共享变量: 如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java内存模型(JM ...
- 细说Java多线程之内存可见性
编程这些实践的知识技能,每一次学习使用可能都会有新的认识 一.细说Java多线程之内存可见性(数据挣用) 1.共享变量在线程间的可见性 共享变量:如果一个 ...
随机推荐
- C# winform 记住密码实现代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- winform 批量控件取值赋值
以前写winform 最多写几个文本框,最近需要入录一个人员信息,那好几十个字段,一下子干蒙了,这要是一个个取值赋值都写到明天了,于是就自己写了个方法,也不是什么高大上的,就是很简单很普通很low的方 ...
- jsp的九大内置对象(查询资料,搬砖所得)
此笔记大部分摘自大神https://www.cnblogs.com/SimonHu1993/,部分通过网上搜寻补充. 1.Request内置对象(类型:HttpServletRequest 表示 ...
- What are rules about using an underscore in a c identifier
http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identi ...
- 算法逆向6——RSA识别
本文原创作者:i春秋作家——icq5f7a075d 1. 算法介绍 RSA算法是一种用数论构造的.基于大合数因子分解困难性的公开密钥密码.由于RSA密码既可用于加密,又可用于数字签名,安全.易懂,因此 ...
- Android NDK开发Crash错误定位
在Android开发中,程序Crash分三种情况:未捕获的异常.ANR(Application Not Responding)和闪退(NDK引发错误).其中未捕获的异常根据logcat打印的堆栈信息很 ...
- struts2中s:select标签的使用
1.第一个例子: <s:select list="{'aa','bb','cc'}" theme="simple" headerKey="00& ...
- cobbler koan自动重装系统
介绍 koan是kickstart-over-a-network的缩写,它是cobbler的客户端帮助程序,koan允许你通过网络提供虚拟机,也允许你重装已经存在的客户端.当运行时,koan会从远端的 ...
- 【bzoj4332】【JSOI2012】 分零食 生成函数 FFT
我们构造$f(x)$的生成函数$G(x)$,那么显然$[x^k]G(x)=Ok^2+Sk+U$ 那么显然,答案即为$\sum_{i=1}^{n} [x^m]G^i(x)$ 我们构造答案的生成函数$F( ...
- Day1 Excel基本知识
1. 数据分析过程 2. 2016增强版Excel 特性 科学管理,科学决策的工具 精细化,量化分析的工具 3. Excel 学什么? 计算机解决问题的思维(抽象) 数据分析的思路与方法 掌握技巧和方 ...