动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
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,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.关于JAVA的字符编码问题.
.Java编程技巧:列表排序代码分析.
.论Java加密技术与Windows的结合.
.JBuilder7+Weblogic7+mysql 开发.
.setSeconds 方法.
.程序员应用EJB 3.0必要的准备.
.setUTCFullYear 方法.
.用Web Service进行企业级的.
.What Is Java.
.用Java从网上抓取指定URL源码的方.
.Ant 使得Java JARs打包变得简单和.
.接口和抽象类的定义方式举例说明.
.java入门与加深(下).
.学习Core Java 2 Volume(一)鼠.
.基础入门:关于java数组的深度思.
.2003 冬季 Java FAQ.
.Java数据结构——基于数组的表.
.谈谈如何保证测试代码的正确性.
.在unix里替换文字的程序.
.Java语言的Socket编程.

多线程Java程序中常见错误的巧处理

发表日期:2008-1-5 |



  作者:俞良松
  
    在几乎所有编程语言中,由于多线程引发的错误都有着难以再现的特点,程序的死锁或其它多线程错误可能只在某些非凡的情形下才出现,或在不同的VM上运行同一个程序时错误表现不同。因此,在编写多线程程序时,事先熟悉和防范可能出现的错误非凡重要。
  
    无论是客户端还是服务器端多线程Java程序,最常见的多线程问题包括死锁、隐性死锁和数据竞争。
  
    死锁
  
    死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
  
    导致死锁的根源在于不适当地运用“synchronized”要害词来治理线程对特定对象的访问。“synchronized”要害词的作用是,确保在某个时刻只有一个线程被答应执行特定的代码块,因此,被答应执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。
  
    由于这个原因,在使用“synchronized”要害词时,很轻易出现两个线程互相等待对方做出某个动作的情形。代码一是一个导致死锁的简单例子。
  
  //代码一
  class Deadlocker {
  int field_1;
  private Object lock_1 = new int[1];
  int field_2;
  private Object lock_2 = new int[1];
  
  public void method1(int value) {
   “synchronized” (lock_1) {
   “synchronized” (lock_2) {
   field_1 = 0; field_2 = 0;
   }
   }
  }
  
  public void method2(int value) {
   “synchronized” (lock_2) {
   “synchronized” (lock_1) {
   field_1 = 0; field_2 = 0;
   }
   }
  }
  }
  
  
  
    参考代码一,考虑下面的过程:
  
    ◆ 一个线程(ThreadA)调用method1()。
  
    ◆ ThreadA在lock_1上同步,但答应被抢先执行。
  
    ◆ 另一个线程(ThreadB)开始执行。
  
    ◆ ThreadB调用method2()。
  
    ◆ ThreadB获得lock_2,继续执行,企图获得lock_1。但ThreadB不能获得lock_1,因为ThreadA占有lock_1。
  
    ◆ 现在,ThreadB阻塞,因为它在等待ThreadA释放lock_1。
  
    ◆ 现在轮到ThreadA继续执行。ThreadA试图获得lock_2,但不能成功,因为lock_2已经被ThreadB占有了。
  
    ◆ ThreadA和ThreadB都被阻塞,程序死锁。
  
    当然,大多数的死锁不会这么显而易见,需要仔细分析代码才能看出,对于规模较大的多线程程序来说尤其如此。好的线程分析工具,例如JProbe Threadalyzer能够分析死锁并指出产生问题的代码位置。
  
    隐性死锁
  
    隐性死锁由于不规范的编程方式引起,但不一定每次测试运行时都会出现程序死锁的情形。由于这个原因,一些隐性死锁可能要到应用正式发布之后才会被发现,因此它的危害性比普通死锁更大。下面介绍两种导致隐性死锁的情况:加锁次序和占有并等待。
  
    加锁次序
  
    当多个并发的线程分别试图同时占有两个锁时,会出现加锁次序冲突的情形。假如一个线程占有了另一个线程必需的锁,就有可能出现死锁。考虑下面的情形,ThreadA和ThreadB两个线程分别需要同时拥有lock_1、lock_2两个锁,加锁过程可能如下:
  
    ◆ ThreadA获得lock_1;
  
    ◆ ThreadA被抢占,VM调度程序转到ThreadB;
  
    ◆ ThreadB获得lock_2;
  
    ◆ ThreadB被抢占,VM调度程序转到ThreadA;
  
    ◆ ThreadA试图获得lock_2,但lock_2被ThreadB占有,所以ThreadA阻塞;
  
    ◆ 调度程序转到ThreadB;
  
    ◆ ThreadB试图获得lock_1,但lock_1被ThreadA占有,所以ThreadB阻塞;
  
    ◆ ThreadA和ThreadB死锁。
  
    必须指出的是,在代码丝毫不做变动的情况下,有些时候上述死锁过程不会出现,VM调度程序可能让其中一个线程同时获得lock_1和lock_2两个锁,即线程获取两个锁的过程没有被中断。在这种情形下,常规的死锁检测很难确定错误所在。
上一篇:java线程简介(其它线程API详细信息) 人气:537
下一篇:对等(P2P)计算实际使用之发展历史回顾 人气:497
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-13 爬爬思特新闻管理系统 v2.0 Beta1
2008-10-13 Pligg v9.9.5 Beta
2008-10-13 广优邮件发送系统 v2.1
2008-10-13 缤纷互动视频交友 v3.1 RC
2008-10-13 MyShop网络商城 build 081005
2008-10-13 Chyrp 超轻量级开源博客引擎 v2.
2008-10-13 162100静态(论坛/文章)系统 v2.4
2008-10-13 金博人才招聘求职网黄金版 v4.2
2008-10-13 愚人笔记 v4.0
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成