Runnable 的作用:将Thread的task实现分离出来。但是如果要是用Thread的方法,就必须集成Thread。(by Johnny Deng)
Volatile关键字:
Java将(除long, double) 变量的基本加载于存储定义为atomic。这就意味着变量的值在存储的时候不会有中间的状态显现,变量也不会在加载到寄存器的中途被其他线程改变。如果一个方法仅有一个存储的操作,他们他是atmoic的,如果setFinished()。
但是,Java的内存模型中,允许thread能在local memory中持有变量的值。在这种情况下,当某thread变更了变量的值是,另一个thread可能并不知道,因为它持有的是local memory的值。
处理的方法除了synchronized外,volatile关键字就保证变量只在主存储器中存储。
举例如下:
一段Java代码的字节码编译指令可以看出其中的区别:
Java代码:
public void run(){
while (!finished){
foo();
}
}
public void setFinished(){
finieshed = true;
}
private boolean finished = false;
字节码指令可能如下:
run()方法:
Begin method run
Load register r1 with memory Location oxff12345
Lable L1:
Test if register == 1
if true branch to L2
Call method foo
Branch to L1
Label L2:
End method run
setFinished()方法:
Being method setFinished
Store 1 into memory location oxff12345
End memory setFinished
如果是:
private volatile boolean finished = false;
则run()方法的逻辑应该是:
Begin method run
Label L1:
Test if memroy location oxff12345 == 1
if true branch to L2
Call method foo
Branch to L1
Label L2:
End method run
25万+

被折叠的 条评论
为什么被折叠?



