Java多线程之volatile关键字《一》
关键字volatile的主要作用是使变量在多个线程间可见。
1.关键字volatile与死循环
如果不是在多继承的情况下,使用继承Thread类和实现Runnable接口在取得程序运行的结果上并没有什么太大的区别。如果一旦出现“多继承”的情况,则用实现Runnable接口的方式来处理多线程的问题就是很有必要的。
下面我们用实现Runnable接口的的方式来理解多线程的使用,也看实验volatile关键字在并发情况下的一些特性。
1.1创建一个PrintString类:
package edu.ymm.about_volatile;
public class PrintString {
private boolean isContinuePrint = true;
public boolean isContinuePrint() {
return isContinuePrint;
}
public void setContinuePrint(boolean isContinuePrint) {
this.isContinuePrint = isContinuePrint;
}
public void printStringMethod() {
try {
while(isContinuePrint == true) {
System.out.println("run printStringMethod threadName"
+ Thread.currentThread().getName());
Thread.sleep(1000);
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
1.2创建一个Test测试类:
package edu.ymm.about_volatile;
public class Test {
public static void main(String[] args) {
PrintString printString = new PrintString();
printString.printStringMethod();
System.out.println("我要停止它! stopThread="
+ Thread.currentThread().getName());
printString.setContinuePrint(false);
}
}
执行结果如下:

程序开始运行,根本就停不下来,结果如上图所示,停不下来的原因主要就是mian线程一直在处理while()循环,导致程序不能继续执行后面的代码。所以得用多线程来解决。
2.解决同步死循环
2.1创建PrintString类如下:
package edu.ymm.about_volatile;
public class PrintString implements Runnable {
private boolean isContinuePrint = true;
public boolean isContinuePrint() {
return isContinuePrint;
}
public void setContinuePrint(boolean isContinuePrint) {
this.isContinuePrint = isContinuePrint;
}
public void printStringMethod() {
try {
while(isContinuePrint == true) {
System.out.println("run printStringMethod threadName"
+ Thread.currentThread().getName());
Thread.sleep(1000);
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
printStringMethod();
}
}
2.2创建Run测试类如下:
package edu.ymm.about_volatile;
public class Run {
public static void main(String[] args) {
PrintString printString = new PrintString();
new Thread(printString).start();
System.out.println("我要停止它! stopThread="
+ Thread.currentThread().getName());
printString.setContinuePrint(false);
}
}
执行结果如下:

但是,上面的代码运行在-server服务器的64bit的JVM上时,会出现死循环,解决办法就是volatile.
关键字volatile的作用就是强制从公共栈里面取得变量的值,而不是从线程私有数据栈中取得变量的值。
Java多线程之volatile关键字《一》的更多相关文章
- java多线程之volatile关键字
public class ThreadVolatile extends Thread { public boolean flag=true; @Override public void run() { ...
- JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...
- Java并发编程之volatile关键字解析
一内存模型的相关概念 二并发编程中的三个概念 三Java内存模型 四深入剖析volatile关键字 五使用volatile关键字的场景 volatile这个关键字可能很多朋友都听说过,或许也都用过.在 ...
- Java多线程之volatile详解
本文目录 从多线程交替打印A和B开始 Java 内存模型中的可见性.原子性和有序性 Volatile原理 volatile的特性 volatile happens-before规则 volatile ...
- Java 并发编程之volatile关键字解析
摘录 1. 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执 ...
- Java并发编程之volatile关键字
大概是因为项目.业务的原因,工作上几乎还没有使用过多线程相关的功能,相关知识差不多都忘了,所以最近补一下基础. volatile用来修饰共享变量,volatile变量具有 synchronized 的 ...
- 多线程之volatile关键字(五)
开始全文之前,先铺垫一下jvm基础知识以及线程栈: JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolea ...
- JAVA多线程之Synchronized关键字--对象锁的特点
一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章 二,分析 s ...
- JAVA 多线程之volatile的介绍
volatile的介绍 volatile的主要作用是:提示编译器该对象的值有可能在编译器未监测的情况下被改变. volatile类似于大家所熟知的const也是一个类型修饰符.volatile是给编译 ...
随机推荐
- stm32_ADC定时器采样(DMA均值处理数据)
在有些要求高的场合,需要用到定时器采样.本人在网上没找到合适的源码,于是将自己的思路分享出来,欢迎大家提出意见. 确定ADC采用的通道对应的通道 确定采样对应的引脚(这个在规格书的引脚定义部分可以找到 ...
- How to Preloading content with rel preload
The preload value of the <link> element's rel attribute allows you to write declarative fetch ...
- 控制反转IOC
IOC-Inversion of Control 控制反转,这是spring的核心.对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系. 1:控制反转不是一种技术,而是 ...
- 使用 notify.js 桌面提醒
//var iN = new iNotify({ // effect: 'flash', // interval: 500, // message: "有消息拉!", // aud ...
- springMVC--annotation
一 解析类 ComponentScanBeanDefinitionParser component-scan标签解析类 component-scan 兼容 annotation-config ,因此前 ...
- Grunt搭建自动化web前端开发环境--完整流程
Grunt搭建自动化web前端开发环境-完整流程 jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前 ...
- Install Sudo for Debian
$ su $ apt-get install sudo $ vim /etc/sudoers 1 2 3 在文本中添加: "username" ALL=(ALL) ALL 1 保存 ...
- Mac下安装SecureCRT并激活
今天花了好长的时间终于把SecureCRT安装成功了 现在分享给大家 安装的步骤, 希望对大家用帮助 Mac下的SecureCRT需要破解才能使用 所以有些费劲的.. 先下载SecureCRT和破解文 ...
- C# 实现http不同方法的请求
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- Running ROS on Windows 10
1.在Windows10下安装ROS.需要开启WSL.参考 2.修改ubuntu国内源,可以提高安装包下载更新速度. (1)原文件备份:sudo cp /etc/apt/sources.list /e ...