一: 内存可见性(volatile)
内存可见性问题: 当多个线程操作共享数据时,彼此不可见。
volatile关键字,当多个线程进行操作共享数据时,可以保证内存中的数据可见。 相较于synchronized, volatile不具有互斥性,并且不能保证原子性。
/**
* volatile关键字,当多个线程进行操作共享数据时,可以保证内存中的数据可见。
* */
public class TestVolatile {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
// try {
// Thread.sleep(4000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
while(true){
// 加锁也能解决可见性,但是效率很低
//synchronized (td){
if(td.isFlag()){
System.out.println("------");
break;
}
//}
}
}
}
class ThreadDemo implements Runnable{
// 没有使用volatile关键字
private boolean flag = false;
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
System.out.println("flag="+flag);
}
}
二: cas算法
cas算法是硬件对于并发操作共享数据的支持。 cas算法包含了三个操作: 1.内存值V 2. 预估值A 3. 更新值B。 当且仅当V == A时, V = B。