java多线程下关于内存可见性的原理,静态变量谈论,非静态变量常规认知没问题。
程序员文章站
2022-03-23 23:21:15
...
对于静态变量而言,若不加volatile关键时,内存的不可见性是指单次读取得不可见性,若是发生了多次读取或者是写入操作,就会立刻更新到主存,保证一致性。
举例:
一次操作,比如只进行while循环,这种情况下内存是不可见的:
import java.util.concurrent.TimeUnit;
/**
* VolatileTest
*
* @author guigu
* @QQ 1170258867
* @date 2020/4/22
* @description VolatileTest
*/
public class VolatileTest {
static volatile int i = 3;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
System.out.println("线程开启了");
while (i==3){
// System.out.println("1");
}
System.out.println("结束");
}).start();
TimeUnit.SECONDS.sleep(1);
i =4;
System.out.println("i="+i);
}
}
如果在循环中加入打印之类的,会重新从主存中读取相应的数值:
import com.sun.crypto.provider.PBEWithMD5AndDESCipher;
import java.util.concurrent.TimeUnit;
/**
* VolatileTest2
*
* @author guigu
* @QQ 1170258867
* @date 2020/4/22
* @description
*/
public class VolatileTest2{
static int i = 1;
public static void main(String[] args) throws InterruptedException {
// new Thread(()->{
// while(i<1000){
// try {
// TimeUnit.SECONDS.sleep(1);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// i++;
// System.out.println("子线程:"+i);
// }
// System.out.println(i);
// }).start();
new Thread(()->{
System.out.println("开始");
while (i==1) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
System.out.println("结束");
}).start();
while (true) {
TimeUnit.SECONDS.sleep(1);
System.out.println("主线程:"+i++);
}
}
}
若有不对之处,还望及时指出。