当前位置:七道奇文章资讯编程技术Java编程
日期: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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .