网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.读取数码照片中的Exif信息.
.探索Application Server的世界.
.异常处理优劣观.
.关于手机游戏中的炮弹轨迹—抛物.
.this关键字.
.Java Servlet 编程及应用.
.百分之百纯Java(TM)-如何翻译Ja.
.Java语言编码规范 选择自 hk_von.
.Java 语言是强类型语言语言.
.JCreatorPro3.0与WTK2.0配置心得.
.与其它国际认证的对比.
.开发工具:用JBuiler玩转petstore.
.SLG中搜索某个角色可移动区域的算.
.使用AWT将Graphics对象转换为Ima.
.java 继承的基础.
.JDK的命令详解(2).
.在 WAS 中使用 Java 安全套接字扩.
.DriveType 属性.
.Struts源代码阅读(Commons-Vali.
.跨越边界: Java 模型以外的类型策.

Java 程序中的多线程(三)

发表日期:2008-1-5



  作者: Neel V. Kumar
  synchronized 要害字
  到目前为止,我们看到的示例都只是以非常简单的方式来利用线程。只有最小的数据流,而且不会出现两个线程访问同一个对象的情况。但是,在大多数有用的程序中,线程之间通常有信息流。试考虑一个金融应用程序,它有一个 Account 对象,如下例中所示:
  一个银行中的多项活动
  public class Account {
  String holderName;
  float amount;
  public Account(String name, float amt) {
  holderName = name;
  amount = amt;
  }
  public void deposit(float amt) {
  amount += amt;
  }
  public void withdraw(float amt) {
  amount -= amt;
  }
  public float checkBalance() {
  return amount;
  }
  }
  在此代码样例中潜伏着一个错误。假如此类用于单线程应用程序,不会有任何问题。但是,在多线程应用程序的情况中,不同的线程就有可能同时访问同一个 Account 对象,比如说一个联合帐户的所有者在不同的 ATM 上同时进行访问。在这种情况下,存入和支出就可能以这样的方式发生:一个事务被另一个事务覆盖。这种情况将是灾难性的。但是,Java 编程语言提供了一种简单的机制来防止发生这种覆盖。每个对象在运行时都有一个关联的锁。这个锁可通过为方法添加要害字   synchronized 来获得。这样,修订过的 Account 对象(如下所示)将不会遭受像数据损坏这样的错误:
  对一个银行中的多项活动进行同步处理
  public class Account {
  String holderName;
  float amount;
  public Account(String name, float amt) {
  holderName = name;
  amount = amt;
  }
  public synchronized void deposit(float amt) {
  amount += amt;
  }
  public synchronized void withdraw(float amt) {
  amount -= amt;
  }
  public float checkBalance() {
  return amount;
  }
  }
  deposit() 和 withdraw() 函数都需要这个锁来进行操作,所以当一个函数运行时,另一个函数就被阻塞。请注重,checkBalance() 未作更改,它严格是一个读函数。因为 checkBalance() 未作同步处理,所以任何其他方法都不会阻塞它,它也不会阻塞任何其他方法,不管那些方法是否进行了同步处理。
上一篇:java线程简介(无处不在的线程) 人气:597
下一篇:Java 程序中的多线程(四) 人气:584
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐