日期:2011-03-22 16:16:00 来源:本站整理
Java多线程同步中的两个分外类[Java编程]
本文“Java多线程同步中的两个分外类[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Java语言内置了synchronized关键字用于对多线程举行同步,大大便利了Java中多线程程序的编写.但是仅仅利用synchronized关键字还不能满意对多线程举行同步的全部需求.大家知道,synchronized仅仅可以对办法大概代码块举行同步,假如我们一个利用需求超越多个办法举行同步,synchroinzed就不能胜任了.在C++中有很多同步机制,比方信号量、互斥体、临届区等.在Java中也可以在synchronized语言特点的底子上,在更高层次构建这样的同步工具,以便利我们的利用.
当前,广为利用的是由Doug Lea编写的一个Java中同步的工具包,可以在这儿理解更多这个包的具体情形:
http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
该工具包已经作为JSR166正处于JCP的掌握下,行将作为JDK1.5的正式构成部份.本文并不打算具体解析这个工具包,而是对多种同步机制的一个介绍,同时给出这类同步机制的实例实现,这并非产业级的实现.但此中会参考Doug Lea的这个同步包中的产业级实现的一些代码片断.
本例中还相沿上篇中的Account类,不过我们这儿编写一个新的ATM类来模拟自动提款机,通过一个ATMTester的类,生成10个ATM线程,同时对John账户举行查询、提款和存款操作.Account类做了一些窜改,以便适应本篇的需求:
import java.util.HashMap;
import java.util.Map;
class Account
{
String name;
//float amount;
//利用一个Map模拟长期存储
static Map storage = new HashMap();
static
{
storage.put("John", new Float(1000.0f));
storage.put("Mike", new Float(800.0f));
}
public Account(String name)
{
//System.out.println("new account:" + name);
this.name = name;
//this.amount = ((Float)storage.get(name)).floatValue();
}
public synchronized void deposit(float amt)
{
float amount = ((Float)storage.get(name)).floatValue();
storage.put(name, new Float(amount + amt));
}
public synchronized void withdraw(float amt)
throws InsufficientBalanceException
{
float amount = ((Float)storage.get(name)).floatValue();
if (amount >= amt) amount -= amt;
else throw new InsufficientBalanceException();
storage.put(name, new Float(amount));
}
public float getBalance()
{
float amount = ((Float)storage.get(name)).floatValue();
return amount;
}
}
在新的Account类中,我们采取一个HashMap来存储账户信息.Account由ATM类通过login登录后利用:
public class ATM
{
Account acc;
//作为演示,省略了密码考证
public boolean login(String name)
{
if (acc != null) throw new IllegalArgumentException("Already logged in!");
acc = new Account(name);
return true;
}
public void deposit(float amt)
{
acc.deposit(amt);
}
public void withdraw(float amt) throws InsufficientBalanceException
{
acc.withdraw(amt);
}
public float getBalance()
{
return acc.getBalance();
}
public void logout ()
{
acc = null;
}
}
以上是“Java多线程同步中的两个分外类[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论