当前位置:首页 > PHP教程 > PHP总结归纳

并发集合(八)使用原子变量

声明:本文是《 java 7 concurrency cookbook 》的第一章, 作者: javier fernández gonzález 译者:郑玉婷 校对:方腾飞 在java 1.5中就引入了原子变量,它提供对单个变量的原子操作。当你在操作一个普通变量时,你在java实现的每个操作,在程序编译时会

声明:本文是《 java 7 concurrency cookbook 》的第一章, 作者: javier fernández gonzález 译者:郑玉婷 校对:方腾飞

在java 1.5中就引入了原子变量,它提供对单个变量的原子操作。当你在操作一个普通变量时,你在java实现的每个操作,在程序编译时会被转换成几个机器能读懂的指令。例如,当你分配一个值给变量,在java你只使用了一个指令,但是当你编译这个程序时,这个指令就被转换成多个jvm 语言指令。这样子的话当你在操作多个线程且共享一个变量时,就会导致数据不一致的错误。

为了避免这样的问题,java引入了原子变量。当一个线程正在操作一个原子变量时,即使其他线程也想要操作这个变量,类的实现中含有一个检查那步骤操作是否完成的机制。 基本上,操作获取变量的值,改变本地变量值,然后尝试以新值代替旧值。如果旧值还是一样,那么就改变它。如果不一样,方法再次开始操作。这个操作称为 compare and set(校对注:简称cas,比较并交换的意思)。

原子变量不使用任何锁或者其他同步机制来保护它们的值的访问。他们的全部操作都是基于cas操作。它保证几个线程可以同时操作一个原子对象也不会出现数据不一致的错误,并且它的性能比使用受同步机制保护的正常变量要好。

在这个指南,你将学习怎样使用原子变量实现一个银行账户和2个不同的任务:一个存钱到账户和另一个从账户提取钱。在例子的实现中,你将使用 atomiclong 类。

准备

指南中的例子是使用eclipse ide 来实现的。如果你使用eclipse 或者其他的ide,例如netbeans, 打开并创建一个新的java项目。

怎么做呢…

按照这些步骤来实现下面的例子:
[ code language='java']
//1. 创建一个类,名为 account,来模拟银行账号。
public class account {

//2. 声明一个私有 atomiclong 属性,名为 balance,用来储存账号的余额。
private atomiclong balance;

//3. 实现类的构造函数,初始化它的属性值。
public account(){
balance=new atomiclong();
}

//4. 实现一个方法,名为 getbalance(),用来返回余额属性值。
public long getbalance() {
return balance.get();
}

//5. 实现一个方法,名为 setbalance(),用来设置余额属性值。
public void setbalance(long balance) {
this.balance.set(balance);
}

//6. 实现一个方法,名为 addamount(),来增加余额属性值。
public void addamount(long amount) {
this.balance.getandadd(amount);
}

//7. 实现一个方法,名为 substractamount() 来减少余额属性值。
public void subtractamount(long amount) {
this.balance.getandadd(-amount);
}

//8. 创建一个类,名为 并一定实现 runnable 接口。这个类会模拟公司付款。
public class company implements runnable {

//9. 声明一个私有 account 属性,名为 account。
private account account;

//10. 实现类的构造函数,初始化它的属性值。
public company(account account) {
this.account=account;
}

//11. 实现任务的 run() 方法。 使用 account 的 addamount()方法来让它的余额做10次的递增,递增额为1000。
@override
public void run() {
for (int i=0; i
【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!