看一遍就懂,详解java多线程——volatile
多线程一直以来都是面试必考点,而volatile、synchronized也是必问点,这里我试图用容易理解的方式来解释一下volatile。
来看一下它的最大特点和作用:
一 使变量在多个线程间可见
public class OneThread extends Thread {
private boolean running = true;
@Override
public void run() {
System.out.println("进入run方法");
while (running) {
}
System.out.println("线程执行完毕");
}
public void setRunning(boolean running) {
this.running = running;
}
}
测试类
public class Test {
public static void main(String[] args) throws InterruptedException {
OneThread oneThread = new OneThread();
oneThread.start();
Thread.sleep(1000);
oneThread.setRunning(false);
}
}
在OneThread类中有一个全局变量running,它会进到堆里,被所有线程共享。
public class Test {
public static void main(String[] args) throws InterruptedException {
OneThread oneThread = new OneThread();
oneThread.start();
Thread.sleep(1000);
oneThread.setRunning(false);
new Thread(() -> System.out.println(oneThread.isRunning())).start();
}
}
这里我们再起一个线程去读取running的值,这时读取的就是主内存的值了。
public class OneThread extends Thread {
private boolean running = true;
@Override
public void run() {
System.out.println("进入run方法");
try {
Thread.sleep(1100);
System.out.println(running);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程执行完毕");
}
public void setRunning(boolean running) {
this.running = running;
}
public boolean isRunning() {
return running;
}
}
我们用volatile修饰running后,再试一下那个死循环代码,终于OK了。
二 volatile是非原子性的
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class VolatileTest {
private static CyclicBarrier barrier = new CyclicBarrier(100);
private static volatile int count;
public static void main(String[] args) {
MyThread[] mythreadArray = new MyThread[1000];
for (int i = 0; i < 1000; i++) {
mythreadArray[i] = new MyThread();
mythreadArray[i].start();
}
}
static class MyThread extends Thread {
private void addCount() {
for (int i = 0; i < 100; i++) {
count++;
}
System.out.println("count=" + count);
}
@Override
public void run() {
try {
barrier.await();
addCount();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
三 和Synchronize对比
看一遍就懂,详解java多线程——volatile的更多相关文章
- 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)
在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...
- 【Java学习笔记之三十四】超详解Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- 【java】详解java多线程
目录结构: contents structure [+] 线程的创建与启动 继承Thread类创建线程类 实现Runnable接口创建线程类 使用Callable和Future创建线程 线程的生命周期 ...
- 详解Java多线程锁之synchronized
synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法. synchronized的四种使用方式 修饰代码块:被修饰的代码块称为同步语句块,其作用的范围是大括号{}括 ...
- 详解Java多线程编程中LockSupport
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark() ...
- 详解Java多线程编程中LockSupport类的线程阻塞用法
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: p ...
- 从缓存入门到并发编程三要素详解 Java中 volatile 、final 等关键字解析案例
引入高速缓存概念 在计算机在执行程序时,以指令为单位来执行,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入. 由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这 ...
- java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的
本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...
- 详解Java中的clone方法
详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...
随机推荐
- 20145310 《Java程序设计》第8周学习总结
20145310 <Java程序设计>第8周学习总结 教材学习内容总结 本周主要进行第十四章和第十五章的学习. 第十四章 NIO使用频道(channel)来衔接数据节点,对数据区的标记提供 ...
- [翻译]纠正PostCSS的4大认识误区
市面上已经有很多的前端工具,再来引入新的前端工具,价值大不大?这主要取决于,它是否给开发人员提供了新的功能,是否值得花时间和精力去学习和使用? PostCSS出现时有一个很有趣的现象.像sass和le ...
- Alluxio集成Hadoop
准备工作 为了运行Alluxio集群在多个机器上,必须部署Alluxio服务到这些机器上.可以下载伴随特定Hadoop版本的二进制AlLxio包,也可以从Alluxio源码中编译. 当从源码中编译时, ...
- SpringCloud Feign报错:Method has too many Body parameters
1.feign多参数问题 1.1GET方式 错误写法 @RequestMapping(value="/test", method=RequestMethod.GET) Model ...
- Ubuntu16.04怎么安装virtualenv虚拟环境
最近安装virtualenv的python虚拟环境,在网上找了很多,尝试了很多,都有各种问题,最终搞定后,给大家分享下我的过程,希望大家少走弯路. 本次安装是基于Ubuntu16.04Linux版本安 ...
- NuGet version
https://stackoverflow.com/questions/15964935/get-nuget-exe-version-from-command-line Typing nuget he ...
- windchill10.0&11.0API_chm版百度云
windchill10.0版本和11.0版本的javadoc,也就是api 文件内容 windchill10.0.chm版本的 windchill10.0api.chm版本 百度云链接(免费推荐) 链 ...
- spring boot2.1读取 apollo 配置中心1
第一篇:搭建apollo配置中心 为什么选择apollo,我做了一些对比: Diamond Disconf Apollo Spring Cloud Config 数据持久性 mysql mysql ...
- DLL注入之SHELLCODE数据转换
#include "stdafx.h" #include <stdio.h> #include <string.h> #include <conio. ...
- Python之NumPy(axis=0 与axis=1)区分
转自:http://blog.csdn.net/wangying19911991/article/details/73928172 https://www.zhihu.com/question/589 ...