其实我是发现有矛盾的问题的。
多线程主要是 可见性、原子性的问题,volatile 主要是 解决了可见性的问题,原子性并未解决,所以仍是线程不安全的。
如果没有volatile 关键字,两个线程,左边线程从共享内存中获取x=1 ,将x给到自己的工作内存,修改后,写回共享内存,此时线程2是不知道的,获取的仍是x=1;
加了volatile ,则线程1 ,直接对共享内存的x操作,线程2是立刻知道的。
package com.caolh.middle;
import java.util.ArrayList;
import java.util.List;
public class DemoThread13{
private List<String> list = new ArrayList<String>();
private volatile boolean canGet = false;
public void put(){
for(int i=0;i<10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
list.add("A");
System.out.println("线程"+Thread.currentThread().getName()+"添加第"+i+"个元素");
if(i==5){
//循环到第次则通知其他线程开始获取数据进行处理
canGet = true;
System.out.println("线程"+Thread.currentThread().getName()+"发出通知");
}
}
}
public void get(){
while(true){
if(canGet){
for(String s:list){
System.out.println("线程"+Thread.currentThread().getName()+"获取元素:"+s);
}
break;
}
}
}
public static void main(String[] args) {
final DemoThread13 demo = new DemoThread13();
new Thread(new Runnable() {
@Override
public void run() {
demo.put();
}
},"t1").start();;
new Thread(new Runnable() {
@Override
public void run() {
demo.get();
}
},"t2").start();
}
}
不加volatile ,线程2 关闭不掉。但是我们一般 的多线程访问同一个变量,是可以立即可见的吧?这里程序一直停不掉。