Java多线程系列(4)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值