JUC概述
在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,
用于定义类似于线程的自定义子系统,包括线程池,异步IO和轻量级任务框架;还提供了用于多线程上下文中的 Collection实现等。
在并发编程中有三个特性(也是需要解决的三个主要问题):
- 互斥性(原子性)
- 内存可见性
- 指令重排序
一、volatile修饰符
volatile: 易变的,不稳定的。
对于volatile,具备的特性主要是:
- 当多个线程进行操作共享数据时,可以保证内存中的数据是可见的;相较于 synchronized 是一种较为轻量级的同步策略;
- 不具备"互斥性",不能保证变量的"原子性";
- 可以禁止指令重排序
volatile和synchronized的区别:
synchronized可以实现互斥性和内存可见性,不能禁止指令重排序。
volatile可以实现内存可见性,禁止指令重排序,不能保证原子性(互斥性)。
什么是内存可见性?
//线程类:
public class MyThread extends Thread {
public boolean flag;
@Override
public void run() {
System.out.println("子线程开始执行");
while (true) {
if (flag) {
break;
}
}
System.out.println("子线程结束了");
}
}
//main方法
public class Demo {
public static void main(String[] args) throws IOException {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("输入任意字符结束子线程");
System.in.read();
myThread.flag = true;
}
}