对于JUC方面的面试题,我们首先应该讲一下JMM
JMM(Java Memory Model) Java内存模型
首先看一下java内存模型图
对于JMM 是有以下要求:
1.保持原子性
2.保持可见性
3.有序性
对于一些操作,分别对应在下面图
/**
*
*/
package com.matao.concurrent.atomic;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author MT
*
*/
public class ThreandDemo {
public static boolean initFlag = true;
public static void main(String[] args) {
new Thread( new Runnable() {
public void run() {
System.out.println("thread1 is runing");
while(initFlag){
}
System.out.println("thread1 ends");
}
}).start();
//睡眠两秒钟
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread2 is runing");
initFlag = false;
}
}).start();
}
}
对于以上代码,我们会发现代码运行之后,会处于一直运行状态,但当我们加上了volatile关键字就会让程序正常结束
谈谈对volatile关键字的理解
- volatile是jvm提供的轻量级的同步机制
volatile有以下特性:
1)保持可见性
2)不保证原子性
3)禁止指令重排
验证可见性的代码:
/**
*
*/
package com.matao.concurrent.atomic;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author MT
*
*/
public class ThreandDemo {
public static volatile boolean initFlag = true;
public static void main(String[] args) {
new Thread( new Runnable() {
public void run() {
System.out.println("thread1 is runing");
while(initFlag){
}
System.out.println("thread1 ends");
}
}).start();
//睡眠两秒钟
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(new Runnable() {