Java多线程之可见性与原子性——synchronized VS volatile
<转:http://blog.csdn.net/uniquewonderq/article/details/48113071>
程序举例:
代码:
- package com.synch;
- public class SynchronizedDemo {
- //共享变量
- private boolean ready = false;
- private int result = 0;
- private int number = 1;
- //写操作
- public synchronized void write(){
- ready = true;
- number = 2;
- }
- //读操作
- public synchronized void read(){
- if(ready){
- result = number*3;
- }
- System.out.println("result的值为:" + result);
- }
- //内部线程类
- private class ReadWriteThread extends Thread {
- //根据构造方法中传入的flag参数,确定线程执行读操作还是写操作
- private boolean flag;
- public ReadWriteThread(boolean flag){
- this.flag = flag;
- }
- @Override
- public void run() {
- if(flag){
- //构造方法中传入true,执行写操作
- write();
- }else{
- //构造方法中传入false,执行读操作
- read();
- }
- }
- }
- public static void main(String[] args) {
- SynchronizedDemo synDemo = new SynchronizedDemo();
- //启动线程执行写操作
- synDemo .new ReadWriteThread(true).start();
- // try {
- // Thread.sleep(1000);
- // } catch (InterruptedException e) {
- // // TODO Auto-generated catch block
- // e.printStackTrace();
- // }
- //启动线程执行读操作
- synDemo.new ReadWriteThread(false).start();
- }
- }
代码示例:
- package com.synch;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class VolatileDemo {
- private Lock lock = new ReentrantLock();
- private int number = 0;
- public int getNumber(){
- return this.number;
- }
- public void increase(){
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- lock.lock();
- try {
- this.number++;
- } finally {
- lock.unlock();
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- final VolatileDemo volDemo = new VolatileDemo();
- for(int i = 0 ; i < 500 ; i++){
- new Thread(new Runnable() {
- @Override
- public void run() {
- volDemo.increase();
- }
- }).start();
- }
- //如果还有子线程在运行,主线程就让出CPU资源,
- //直到所有的子线程都运行完了,主线程再继续往下执行
- while(Thread.activeCount() > 1){//让所有的子线程都执行完后,然后再执行<pre name="code" class="java">//System.out.println("number : " + volDemo.getNumber()); 语句。因为主线程算一个。当活跃线程为1时,也就是所有的子线程执行完毕了。此///时退出while 循环执行输出语句。
Thread.yield();}System.out.println("number : " + volDemo.getNumber());}}
Java多线程之可见性与原子性——synchronized VS volatile相关推荐
- java 多线程变量可见性_Java多线程:易变变量,事前关联和内存一致性
java 多线程变量可见性 什么是volatile变量? volatile是Java中的关键字. 您不能将其用作变量或方法名称. 期. 我们什么时候应该使用它? 哈哈,对不起,没办法. 当我们在多线程 ...
- Java多线程中使用ReentrantLock、synchronized加锁 简单举例
Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...
- Java多线程学习(二)synchronized关键字(1)
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...
- Java多线程之可见性之volatile
可见性 一个线程对主内存的修改可以及时被其它线程观察到 导致共享变量在线程间不可见的原因 线程交叉执行 指令重排序加上线程交叉执行 共享变量更新后的值没有在工作内存与主存间及时更新 保证可见性和原子性 ...
- 【Java进阶营】JAVA多线程基础学习二:synchronized
本篇主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题,没错就是使用synchronized. 一.如何解决线程安全问题? 一般 ...
- Java线程(二):线程同步synchronized和volatile
上篇通 过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么 会产生这样的结果呢,因为建立的Count对象是 ...
- Java 并发编程_详解 synchronized 和 volatile
文章目录 1. synchronized 的应用 1.1 基础知识 1.2 synchronized 语法 2. Monitor概念 3. Synchronized原理进阶 3.1 对象头格式 3.2 ...
- Java多线程的同步机制:synchronized
如果程序是单线程的,就不必担心此线程在执行时被其他线程"打扰",就像在现实世界中,在一段时间内如果只能完成一件事情,不用担心做这件事情被其他事情打扰.但是,如果程序中同时使用多线程 ...
- Java多线程学习十二: synchronized的工作原理 以及背后的“monitor 锁”
我们研究下 synchronized 背后的 monitor 锁. 获取和释放 monitor 锁的时机 我们都知道,最简单的同步方式就是利用 synchronized 关键字来修饰代码块或者修饰一个 ...
- 【转载】Java多线程编程2--同步锁定--synchronized同步方法、脏读、锁重入
线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 1.方法内的变量为线程安全 "非线程安全"问题存在于"实例变量"中,如果是方法内 ...
最新文章
- 潘石屹Python考试成绩99分,网友:还有一分怕你骄傲
- javascript this指针详解
- oracle adf 使用,ORACLE ADF 问题总结
- python基础教程微信_用Python实现让微信地球转起来附代码!
- android layout 点击,Tips_Android点击事件(Down、Move、Up)的分发_重写Layout响应拖动事件...
- 转 Intellij中的常用快捷键
- You can't specify target table 'myusertable' for ......in FROM clause
- mysql启动失败LSB_MySQL数据库服务启动失败
- 基于代数距离的椭圆拟合
- 【渝粤题库】陕西师范大学700005 遗传学
- 计算机组成原理AB什么运算,计算机组成原理运算器实验.doc
- 云商城云小店官网源码-修复30套模板支持一键对接各大系统
- ios -特殊符号大全分享给大家,直接复制粘贴就可以使用了!
- linux vmware时间问题
- 腾讯云服务器安装AMH控制面板
- 图像处理中的差分求导计算和相应的卷积核(filter)
- ubuntu20.04安装无线网卡驱动
- 2022-8-03 第七小组 黄均睿 学习日记 (day27)线程2
- 体验Android:个人所得税计算器 含源码
- html一个大网页5个小网页,5个范例告诉你:什么是自适应网页设计
热门文章
- Atitit 游戏引擎---物理系统(1)------爆炸效果
- atitit.导出excel的设计----查询结果 导出为excel的实现java .net php 总结
- paip.提升用户体验-----用户注册设计
- Rust : Json Web Token
- 华为招聘产业联盟高级专家、 开发者生态专家
- 【手指识别】基于matlab GUI指尖图像采集与检测【含Matlab源码 585期】
- 【优化求解】基于matlab改进的灰狼算法求解重油热解优化模型【含Matlab源码 164期】
- 硕士转行学python_0基础转行编程学习Python是最快的途径吗?
- ai 道德_AI如何提升呼叫中心的道德水平?
- c语言儿童教学_五岁儿童的自然语言处理