6.可见性关键字(volidate)
可见性关键字(volidate):
如果对java内存模型了解较清楚的话,我们知道每个线程都会被分配一个线程栈。
线程栈里存的是对象的引用,但当前cache缓存机制,可能会把数据拷贝。
就是,命中缓存,去数据是从cache中获取,而不是从本地内存读取。
不加关键字实例:
package com.xm.thread.t_19_01_27;
import java.util.concurrent.TimeUnit;
public class VolatileDemo implements Runnable{
Boolean state = false;
volatile int count = 0;
@Override
public void run() {
if(state==true || count<10) {
count ++;
System.out.println("state="+state+";count="+count);
} else {
System.out.println("state="+state+";count="+count);
}
}
public static void main(String[] args) throws InterruptedException {
VolatileDemo demo = new VolatileDemo();
for(int i=0;i<100;i++) {
new Thread(demo).start();
}
TimeUnit.MILLISECONDS.sleep(10);
demo.state = true;
TimeUnit.MILLISECONDS.sleep(10);
demo.state = false;
TimeUnit.MILLISECONDS.sleep(10);
demo.state = true;
}
}
运行结果:
state=false;count=2
state=false;count=2
state=false;count=3
state=false;count=2
state=false;count=4
state=false;count=5
state=false;count=6
state=false;count=7
state=false;count=8
state=false;count=9
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=true;count=19
state=true;count=18
state=true;count=17
state=true;count=16
state=true;count=15
state=true;count=15
state=true;count=15
state=true;count=13
state=true;count=12
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
加关键字实例:
package com.xm.thread.t_19_01_27;
import java.util.concurrent.TimeUnit;
public class VolatileDemo implements Runnable{
volatile Boolean state = false;
volatile int count = 0;
@Override
public void run() {
if(state==true || count<10) {
count ++;
System.out.println("state="+state+";count="+count);
} else {
System.out.println("state="+state+";count="+count);
}
}
public static void main(String[] args) throws InterruptedException {
VolatileDemo demo = new VolatileDemo();
for(int i=0;i<100;i++) {
new Thread(demo).start();
}
TimeUnit.MILLISECONDS.sleep(10);
demo.state = true;
TimeUnit.MILLISECONDS.sleep(10);
demo.state = false;
}
}
运行结果:
state=false;count=1
state=false;count=2
state=false;count=3
state=false;count=4
state=false;count=5
state=false;count=6
state=false;count=7
state=false;count=8
state=false;count=9
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=true;count=12
state=false;count=10
state=true;count=14
state=true;count=17
state=true;count=18
state=true;count=21
state=true;count=25
state=true;count=28
state=false;count=10
state=true;count=31
state=true;count=32
state=true;count=33
state=true;count=35
state=true;count=29
state=true;count=28
state=true;count=26
state=true;count=24
state=true;count=23
state=true;count=22
state=true;count=20
state=true;count=19
state=true;count=17
state=true;count=15
state=true;count=13
state=true;count=11
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=true;count=42
state=true;count=41
state=true;count=41
state=true;count=40
state=true;count=39
state=true;count=39
state=true;count=39
state=true;count=34
state=true;count=31
结果分析:
volidate就是保证每次读数据都会从内存中读取,但只是保证多线程内共享资源的可见性。
可见性,只是保证取出来的数据是当前内存中放的数据,但无法保证数据一定写入正确。
6.可见性关键字(volidate)的更多相关文章
- 关键字volidate和transient(转)
Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一 ...
- scala教程之:可见性规则
文章目录 public Protected private scoped private 和 scoped protected 和java很类似,scala也有自己的可见性规则,不同的是scala只有 ...
- Volatile关键字和ThreadLocal变量的简单使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11812459.html package thread; /** * volatile关键字和T ...
- 《Java虚拟机并发编程》学习笔记
对<Java虚拟机并发编程>这本书真的是相见恨晚.以前对并发编程只是懂个皮毛,这本书让我对并发编程有了一个全新的认识.所以把书上的知识点做下笔记,以便以后复习使用. 并发与并行 仔细说来, ...
- 在Xcode中使用Clang Format
Xcode中的Re-Indent,顾名思义,只是一个调整缩进的功能,完全依赖它来进行代码格式化显然不够用.我们使用了一个叫做ClangFormat-Xcode的插件,配合Re-Indent一起来做代码 ...
- 在Visual Studio中使用AStyle
最近在做一个C++项目,我们使用了一个叫做AStyle的插件来做代码格式化. 下载方式1:通过Visual Studio下载 启动Visual Studio,以下简称VS: 英文版VS:VS主菜单 & ...
- PHP面向对象编程学习之对象基础
php虽然是一门学习起来非常简单的语言,但是这门语言也包含了对面向对象编程的支持.尤其是随着php5的发布,php对面向对象的支持有了很大的进步.最近学习了一下php的面向对象编程,不禁感慨,面向对象 ...
- DELPHI学习---类和对象(五篇)
Classes and objects(类和对象) 类(或者类类型)定义了一个结构,它包括字段(也称为域).方法和属性:类的实例叫做对象:类的字段.方法和属性被称为它的部件(components)或成 ...
- 作为一个新手的Oracle(DBA)学习笔记【转】
一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...
随机推荐
- html和css入门 (三)
文本样式 color 文本颜色 属性名 color 属性值 预定义的颜色名 | 十六进制值的颜色值 | RGB颜色值 默认值 依赖用户代理 描述 设置文本的颜色 direction 文本方向( 属性名 ...
- es6 class类实例、静态、私有方法属性笔记
实例属性.方法 class Foo { valueA = 100 //第一种实例属性定义,位置:new的实例上 constructor() { this.valueB = 200 //第二种实例属性定 ...
- ioc autofac简单示例
1.winform用法: nuget安装autofac public interface ILog { bool Log(string msg); } public class TXTLogger : ...
- Java jdbc入门
1 jdbc入门 1.1 之前操作数据 1)通过mysql的客户端工具,登录数据库服务器 (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 1.2 ...
- HTML DOM insertBefore() 方法 问题
写即时通讯时,每次新增的回话插到原有子节点的前面. 但是出现了以下报错的情况 如图: MDC: var insertedElement = parentElement.insertBefore(new ...
- WPF 蒙罩层 LoadingPage
WPF 蒙罩层 LoadingPage 前言 无论是在PC客户端,移动端,网站,在遇到长时间处理的时候都会需要用到蒙罩层,让用户有更好的体现.今天上网逛了一下各位前辈网友的蒙罩层的实现方式,觉得有很多 ...
- 【Udacity】线性回归方程 Regression
Concept in English Coding Portion 评估回归的性能指标--R平方指标 比较分类和回归 Continuous supervised learning 连续变量监督学习 R ...
- RC4 加解密
加密解密都是这一个接口 int Rc4EncryptFile(std::string in_file_path, std::string out_file_path, const char *rc4_ ...
- CRM系统知识点之一权限(RBAC)
一个项目可以有多个应用 一个做成组件 一个做逻辑判断一个应用(做成组件形式)可以服务于多个项目 rbac权限(role-base access control)who what how什么样的角色对什 ...
- Linux统计文件个数或是代码行数
统计指定后缀名的文件总个数命令: find . -name *.cpp | wc -l 统计一个目录下代码总行数以及单个文件行数: find . -name *.h | xargs wc -l lin ...