线程共享与独占区域
线程通信产生数据竞争
// constant.java
final int P = 10;
final int C = 20;
// shared.java
int pwrite = 0;
int cwrite = 0;
// producer.java
int pread = 0;
public void run(){
pread = cwrite; // 生产者线程需要消费者线程cwrite的数据
pwrite = P;
}
// consumer.java
int cread = 0;
public void run(){
cread = pwrite;// 消费者线程需要生产者线程的pwrite数据
cwrite = C;
}
//按正常结果输出的预期值推断,不会产生同时pread == C(20)和cread == P(10)
cwrite = C
一定是在pread = cwrite
之前执行的;cwrite = C
是在cread = pwrite
之后执行,所以cread = pwrite
一定是在pread = cwrite
之前执行的;cread = pwrite
一定是在pwrite = P
之前执行的,所以结果是不成立public void run(){
pread = cwrite; // 生产者线程需要消费者线程cwrite的数据 --1
pwrite = P; // --2
}
// consumer.java
int cread = 0;
public void run(){
cwrite = C; // --3
cread = pwrite;// 消费者线程需要生产者线程的pwrite数据 -4
}
JMM下的并发问题
线程之工作内存
从上述可知,在JVM运行数据区中,工作内存与主内存是通过JMM模型规范来完成彼此之间的数据交互,因此可以通过JMM定义的内存语义规范来提供数据变量的可见性
重排序
感谢花时间阅读,如果有用欢迎转发或者点个好看,谢谢!!!