如何理解指令重排? Java并发环境下指令重排会带来很多问题,那到底什么是指令重排? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就是说Java 编译器可能重新排列源代码执行的顺序来优化编译的表现,比如 int a = 0, int b = a + 1;int c = 2;在编译成bytecode 以后,执行的顺序可能是int c = 2;int b = a + 1;int a = 0; 大概意思就是,同一个方法中,两个变量的定义前后,会影响程序最后的运行结果。写后读 a = 1;b = a; 写一个变量之后,再读这个位置。写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。读后写 a = b;b = 1; 读一个变量之后,再写这个变量。以上语句不可重排编译器不考虑多线程间的语义可重排: a=1;b=2;指令重排 会 破坏线程间的有序性。如:class OrderExample {int a = 0;boolean flag = false;public void writer() { a = 1; flag = true; }public void reader() { if (flag) { int i = a +1; …… }}}线程A首先执行writer()方法线程B线程接着执行reader()方法线程B在int i=a+1 是不一定能看到a已经被赋值为1因为在writer中,两句话顺序可能打乱线程Aflag=truea=1线程Bflag=true(此时a=0)避免指令重排:加上同步锁synchronized,当然,当保证同步时,就牺牲了程序的效率 为啥log4j打出来的中文是乱码 log4j,slf4j如何讀取conf目錄下的log4j.xml文件?具體如下 请大家帮我看一下这个小JAVA程序 服务器端为什么接收不到呢? 技术问题(求救) 集合问题。。 如何控制JList的滚动 用jbuilder 9打包成的客户端程序,运行bat时找不到main class!!!!!! 请问一个关于HttpURLConnection的问题??? 如何用DOM对象得到参数? Java中LinkedList中的getFirst()方法和element()方法有什么区别? 文件字符集 套壳是什么意思
int b = a + 1;
int c = 2;在编译成bytecode 以后,执行的顺序可能是
int c = 2;
int b = a + 1;
int a = 0;
写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。
读后写 a = b;b = 1; 读一个变量之后,再写这个变量。
以上语句不可重排
编译器不考虑多线程间的语义
可重排: a=1;b=2;指令重排 会 破坏线程间的有序性。
如:class OrderExample {
int a = 0;
boolean flag = false;public void writer() {
a = 1;
flag = true;
}public void reader() {
if (flag) {
int i = a +1;
……
}
}
}
线程A首先执行writer()方法
线程B线程接着执行reader()方法
线程B在int i=a+1 是不一定能看到a已经被赋值为1因为在writer中,两句话顺序可能打乱线程A
flag=true
a=1线程B
flag=true(此时a=0)避免指令重排:加上同步锁synchronized,当然,当保证同步时,就牺牲了程序的效率