看一遍就懂,详解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/ 所谓的复制对象,首先要分配一个和源对象同样 ...
随机推荐
- RocEDU.阅读.写作《乌合之众》(四)
第三卷 不同群体的分类及特点 第二章 被称为犯罪群体的群体 通常,群体犯罪的动机是暗示,参与人认为自己是在履行责任,和平常的犯罪大不相同.犯罪者服从于别人的怂恿,而这种力量在群体中格外强大,犯罪者受到 ...
- [洛谷P4918]信仰收集
题目背景 随着各种势力的迁入,守矢神社丧失了不少信仰现在,为了挽回香火日益惨淡的神社,八坂神奈子派遣神社的风祝早苗去人类村落收集信仰 题目描述 你可以将村落看成一个m个点的有向无环图(编号从1−m), ...
- mybatis中的懒加载
知识点:mybatis中的懒加载的使用 参考:https://www.cnblogs.com/ysocean/p/7336945.html?utm_source=debugrun&utm_me ...
- Numpy学习1
NumPy学习(1) 参考资料: http://www.cnblogs.com/zhanghaohong/p/4854858.html http://linusp.github.io/2016/02/ ...
- 【pytorch】pytorch基础学习
目录 1. 前言 # 2. Deep Learning with PyTorch: A 60 Minute Blitz 2.1 base operations 2.2 train a classifi ...
- Mac 终端命令行报错 -bash: vi: command not found
我遇到的问题与这个类似,但是我的问题也是用该博文作者方法进行中断才解决的,在此表示感谢. 前段时间在 Mac 下使用终端遇到了这个问题: appledeMacBook-Air:~ air$ vi .b ...
- JavaScript权威指南--表达式与运算符
本章要点 表达式是javascript中的一个短语,javascript解释器会将其计算出一个结果. 程序中的常量.变量名就是一种简单的表达式.复杂的表达式是由简单的表达式组成的,比如数组访问表达式. ...
- Entity Framework教程及文章传送门
Entity Framework视频教程http://www.iqiyi.com/playlist296844502.html Model-Code First做法講解與教學 (ASP.net MVC ...
- [PostgreSql]PostgreSql调用函数及用IF EXISTS判断表是否存在
1.创建一个函数function1 -- FUNCTION: public.function1(character varying, integer) -- DROP FUNCTION public. ...
- ItemsSource数据源 或 集合属性 的定义 ——> 的数据源定义(典型)
在Xaml中: ItemsSource="{Binding Path=GridDataSource.PoliceforceDataSource}" 在ViewModel中: Obs ...