Java多线程系列(4)

来源:互联网 发布:萨博软件 编辑:程序博客网 时间:2024/05/16 14:13

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

 

原创粉丝点击