java线程-synchronized实现可见性代码
以下是一个普通线程代码:
package com.Sychronized;
public class SychronizedDemo {
//共享变量
private boolean ready=false;
private int result=0;
private int number=1;
//写操作
public void write()
{
ready=true; //1.1
number=2; //1.2
}
//读操作
public void read()
{
if(ready) //2.1
{
result=number*3; //2.2
}
System.out.println("result值为:"+result);
}
//内部线程类
private class ReadWriteThread extends Thread
{
//根据构造方法传入的flag参数,确定线程执行读操作还是写操作
private boolean flag;
public ReadWriteThread(boolean flag)
{
this.flag=flag;
}
public void run()
{
if(flag)
{
//构造方法传入true,读操作
write();
}
else {
read();
}
}
}
public static void main(String []args)
{
SychronizedDemo synDemo=new SychronizedDemo();
//启动线程执行写操作
synDemo.new ReadWriteThread(true).start();
synDemo.new ReadWriteThread(false).start();
}
}
这段线程目标是输出6。
但是因为线程的执行顺序,可能导致不同的结果:
执行顺序:1.1-》2.1-》2.2-》1.2
结果:3
执行顺序,加上重排序的原因,导致先1.2,后1.1:1.2-》2.1-》2.2-》1.1
结果:0
可见性分析:
导致共享变量在线程间不可见的原因:
1)线程交叉执行
2)重排序结合交叉执行
3)共享变量更新后的值没在工作内存与主内存间及时更新。
安全的代码:
//写操作
public synchronized void write()
{
ready=true;
number=2;
}
//读操作
public synchronized void read()
{
if(ready)
{
result=number*3;
} System.out.println("result值为:"+result);
}
synchronized解决方案:
1)保证原子性:(解决线程的交叉执行,同时解决了因为重排序加上交叉执行导致的结果)
2)可见性:(解决共享变量未及时更新)
java线程-synchronized实现可见性代码的更多相关文章
- 1 Java线程的内存可见性
Java内存的可见性 可见性: 一个线程对共享变量的修改,能够及时被其它线程看到 共享变量: 如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java内存模型(JM ...
- Java 线程 — synchronized、volatile、锁
线程同步基础 synchronized 和volatile是Java线程同步的基础. synchronized 将临界区的内容上锁,同一时刻只有一个进程能访问该临界区代码 使用的是内置锁,锁一个时刻只 ...
- java 线程基本概念 可见性 同步
开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于J ...
- Java的synchronized的同步代码块和同步方法的区别
synchronized同步方法和同步代码块的区别 同步方法默认使用this或者当前类做为锁. 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不 ...
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- Java 线程池框架核心代码分析
前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executor接口,提供了一种标准的方法将任务的提交过 ...
- 深入理解Java并发synchronized同步化的代码块不是this对象时的操作
本文仅仅是为了说明synchronized关键字同步的是对象不是方法,列子的确有失偏颇. 一.明确一点synchronized同步的是对象不是方法也不是代码块 我有关synchronized同步的是 ...
- Java线程synchronized(一)
线程安全概念:当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. synchronized:可以在任意对象及方法上加锁,而加锁的这段代码 ...
- java线程--volatile实现可见性
volatile关键字: 1)能够保证volatile变量的可见性 2)不能保证volatile变量复杂操作的原子性. volatile如何实现内存可见性: 深入来说:通过加入内存屏障和禁止重排序优化 ...
随机推荐
- bzoj 1007 半交平面简化版
本题就是求半交平面的交包含哪些直线,而且有点特殊(一般的半交平面用双端队列,因为可能转到最开始的直线,但本题不会,所以只需要一端操作就行了). /*************************** ...
- ZOJ 1015 弦图判定
一些定义: 弦图是一种特殊图:它的所有极小环都只有3个顶点. 单纯点:该顶点与其邻接点在原图中的导出子图是一个完全图. 图G的完美消去序列:一个顶点序列a1a2a3...an,使得对于每个元素ai,a ...
- VK Cup 2016 - Qualification Round 2 C. Road Improvement dfs
C. Road Improvement 题目连接: http://www.codeforces.com/contest/638/problem/C Description In Berland the ...
- hdu 4114 Disney's FastPass 状压dp
Disney's FastPass Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...
- React Native中树 TreeView 实现(2)
接上文,剩下的展示工作是重中之重,首先确定节点的布局草稿——也就是如何render item: 在此之前还有一个重要的问题就是选择何种组件盛放展示子结点,一般有如下两种: 使用scrollview加载 ...
- OpenVPN Server端配置文件详细说明(转)
本文将介绍如何配置OpenVPN服务器端的配置文件.在Windows系统中,该配置文件一般叫做server.ovpn:在Linux/BSD系统中,该配置文件一般叫做server.conf.虽然配置文件 ...
- ou have not concluded your merge (MERGE_HEAD exists)
今天获取git线上仓库代码报了这个错误: zhangzhi@moke:~/code/ktsg-api$ git pull You have not concluded your merge (MERG ...
- tomcat服务器重启后session可以继续使用
原文:http://blog.csdn.net/e421083458/article/details/8651312 测试没有效果 配置server.xml文件,加入session保存操作 <C ...
- Memcached源码分析——内存管理
注:这篇内容极其混乱 推荐学习这篇博客.博客的地址:http://kenby.iteye.com/blog/1423989 基本元素item item是Memcached中记录存储的基本单元,用户向m ...
- Starling 2D框架简介(一)
本系列是对Introducing Starling pdf的翻译,下文是对adobe开发人员中心的一片日志的转载,地址为http://www.adobe.com/cn/devnet/flashplay ...