多线程的三大特性
原子性 独一无二,一致性 保证线程安全问题
可见性 java内存模型图
有序性 join,wait,notify

什么是java内存模型?
答:(属于)多线程可见性jmm
java内存结构是jvm内存分配

Java内存模型,决定了一个线程与另一个线程是否可见
java内存模型 主内存,本地私有内存

Java线程安全之Java内存模型.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class ThreadDemo extends Thread {
private boolean flag = true;

@Override
public void run() {
super.run();
System.out.println("Thread starting run");
while (flag) {
}
System.out.println("Thread Stop");
}

public void setFlag(boolean flag){
this.flag = flag;
}


public static void main(String[] args) {
ThreadDemo threadDemo = new ThreadDemo();
threadDemo.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
threadDemo.setFlag(false);
System.out.println("Stop");
}
}

上面代码执行后线程停止了才对啊,为什么没停止
答:其实嘛就是和上面说的java内存模型一样,因为子线程没有及时刷新数据导致的

解决方法就是给flag变量加上volatile关键字强制刷新就可以了
volatile 作用保证线程之间的可见性,但不保证原子性

所以jdk1.52中有个并发包类在
java.util.concurrent.atmoic中
具体请查看jdk 1.5及以上的api手册