Java多线程之可见性与原子性——synchronized VS volatile
程序举例:
代码:
- 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并发之可见性与原子性:Syncronized和volatile
转载:http://blog.csdn.net/guyuealian/article/details/52525724 在说明Java多线程内存可见性之前,先来简单了解一下Java内存模型. ...
- Java多线程学习(二)synchronized关键字(2)
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- Java多线程学习(二)synchronized关键字(1)
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...
- Java多线程中提到的原子性和可见性、有序性
1.原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并发的情况下,就不会出 ...
- java多线程补:充原子性和可见性
参考:http://www.cnblogs.com/mengyan/archive/2012/08/22/2651575.html 原子性:所谓原子性就是不可分割的,比如:在我们编程中直接给变量赋值, ...
- Java-JUC(二):Java内存模型可见性、原子性、有序性及volatile具有特性
1.Java HotSpot JVM运行时数据区 Java内存模型即Java Memory Model,简称JMM.JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式.JVM是整 ...
- java线程-java多线程之可见性
可见性:一个线程对共享变量值的修改,能够及时呗其他线程看到. 共享变量:如果一个变量在多个线程的内存中都存在副本,那么这个变量就是这几个线程的共享变量. java内存模型(JMM) 描述了java程序 ...
- JAVA多线程基础学习二:synchronized
本篇主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题,没错就是使用synchronized. 一.如何解决线程安全问题? 一般 ...
- Java线程(二):线程同步synchronized和volatile
上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...
随机推荐
- 修复Windows10系统的注册表?
在打开的管理员命令提示符窗口,输入如下命令: ———————————————————————————————— reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Mi ...
- javascrpt 代码
一.window.open关闭子页面时刷新父页面 window.opener.location.reload(); window.opener=null;window.close(); 二.AJAX返 ...
- 前端CSS - 相对定位,绝对定位,固定定位
前端CSS - 相对定位,绝对定位,固定定位 1.1 相对定位 position:relative 相对定位,就是微调元素位置的.让元素相对自己原来的位置,进行位置的微调. 也就是说,如果一个盒子想进 ...
- TiKV 源码解析系列 - Raft 的优化
本系列文章主要面向 TiKV 社区开发者,重点介绍 TiKV 的系统架构,源码结构,流程解析.目的是使得开发者阅读之后,能对 TiKV 项目有一个初步了解,更好的参与进入 TiKV 的开发中.本文是本 ...
- flarum论坛系统搭建教程
安装 PHP 5.5+ and MySQL 5.5+, and install Composer. composer create-project flarum/flarum . --stabilit ...
- 微信小程序——wxParse使用方法
wxParse是一个微信小程序富文本解析组件.现在小程序里面自带了一个<rich-text>组件也能解析富文本,但是表现不尽人意.所以我还是采用的wxParse来解析富文本的. wxPar ...
- 【转】IT族室内锻炼身体的小妙招
上班族.久坐族近年的健康状况令人堪忧,由于缺乏运动加上长期面对辐射,使上班族身体状况越来越差.专家建议上班族应多加运动,只需小小的动作就能轻松获得健康! 梳头:用木梳从前额至头顶部向后部梳刷,逐渐加快 ...
- mac配置--ant
每次在新的电脑安装开发工具总是免不了下载各种软件和配置环境,本文针对mac下安装ant小结一下. 安装ant的方法很多,最直接的可以到apache-ant官网http://ant.apache.org ...
- 使用tomcat搭建centos的yum源
最近在折腾大数据,需要搭建一个yum源.一般的做法是在CentOS中安装httpd,然后将rpm包放入/var/www/html下面,再执行[createrepo .]即可. 不过虚拟机对传文件终归是 ...
- unity---Courtine 协程
尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是 ...