当前位置:七道奇文章资讯编程技术Java编程
日期:2011-01-26 02:54:00  来源:本站整理

<b>在Java平台上举行多线程编程的缺陷</b>[Java编程]

赞助商链接



  本文“<b>在Java平台上举行多线程编程的缺陷</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
        Java 语言的并发编程

  就其自身来说,并发编程是一种技术,供应了操作的同时履行,不管是在单一系统上还是分布在大量系统上.这类操作实际是一些指令次序,比方单独某个顶级任务的子任务,这类操作可以并行履行,大概是作为线程,大概是作为进程.线程和进程之间的本质辨别在于:进程普通是独立的(比方独立的地址空间),所以只能通过系统供应的进程间通信机制举行交互,而线程普通同享单一进程的状况信息,可以直接同享系统资源和内存中的对象.

  可以利用下面两种办法之一,通过量个进程来实现并发.第一种办法是在同一个处理器上运行进程,由操作系统处理进程之间的上下文环境切换.(可以理解,这种切换要比同一进程内多线程之间的上下文环境切换更慢.)第二种办法是构建大规模的并行和复杂的分布式系统,在差别的物理处理器上运行多个进程.

  从内建支持的角度来说,Java 语言通过线程供应并发编程;每个 JVM 都能支持很多线程同时履行.可以用以下两种办法之一在 Java 语言中成立线程:

  担当 java.lang.Thread 类.在这种情形下,已经重写的子类的 run() 办法必须包含实现线程运行时行为的代码.要履行这个代码,需求实例化子类对象,然后调用对象的 start() 办法,这样便可以在内部履行 run() 办法了.

  成立 Runnable 接口的定制实现.这个接口只包含一个 run() 办法,在这个办法中,要安排利用程序代码.要履行这个代码,需求实例化实现类的对象,然后在成立新 Thread 时,把对象作为构造函数的参数传入.然后调用新成立的线程对象的 start() 办法,开始履行掌握的新线程.

  线程安全性和同步

  假如 Java 对象中的某个办法可以安全地运行在多线程环境中,那么就称该办法是 线程安全的.要得到这种安全性,必须有一种机制,通过该机制,运行同一办法的多个线程就可以够同步其操作,这样,在拜候相同的对象或代码行时,就会只答应一个线程被处理.这种同步要求线程利用叫作 信号 的对象彼此举行沟通.

  有一种范例的信号叫作 互斥信号 或 互斥体.顾名思义,这个信号对象的拥有权是互斥的,也就是说,在肆意指按时间,只有一个线程可以拥有互斥体.其他想得到全部权的线程会被阻塞,它们必须等候,直到拥有互斥体的线程释放互斥体.假如多个线程按次序列队等候同一互斥体,那么在当前拥有者释放它的时刻,只有一个等候线程可以得到它;其他线程将持续阻塞.

  在 1970 年代初,C.A.R. Hoare 和其他人共同开辟了一个叫作 监督器 的概念.一个 监督器 就是一个代码主体,它的拜候遭到互斥体的保护.任何想履行这个代码的线程,都必须在代码块顶部得到关联的互斥体,然后在底部再释放它.因为在指按时间只有一个线程可以拥有互斥体,所以这就有效地保证了只有拥有它的线程才能履行监督器的代码块.(受保护的代码不需求相邻 —— 比方,Java 语言中的每个对象都有一个与之关联的监督器.)

  任何想在 Java 语言中举行线程编程的开辟人员,城市当即把上面的内容当作 synchronized 关键字所带来的效果.可以确保包含在 synchronized 块中的 Java 代码在指按时间只被一个线程履行.在内部,可以由运行时将 synchronized 关键字转换成某一种情形:全部的竞争线程都试图得到与它们(指线程)正在操作的对象实例关联的那个(惟一的一个)互斥体.成功得到互斥体的线程将运行代码,然后在退出 synchronized 块时释放互斥体.

  资源耗尽,又称为 线程耗尽,是 Java 语言的 wait/notify 原语无法保证 live-ness 的后果.Java 强迫这些办法要拥有它们等候或告诉的对象的锁.在某个线程上调用的 wait() 办法在开始等候之前必须释放监督器锁,然后在从办法返回并得到告诉之后,必须再次重新得到锁.因此,Java 语言标准在锁本身之外,还描写了一套与每个对象相关的 等候集(wait set).一旦线程释放了对象上的锁(在 wait 的调用之后),线程就会放在这个等候集上.

  大都 JVM 实现把等候线程放在行列中.所以,假如在告诉发生的时刻,还有其他线程在等候监督器,那么就会把一个新线程放在行列尾部,而它并非下一个得到锁的线程.所以,等到被告诉线程实际得到监督器的时刻,告诉该线程的条件大概已经不再为真,所以它不得不再次 wait.这种情形大概无限持续下去,从而造成运算工作上浪费(因为要反复把该线程放入等候集和从中取出)和线程耗尽.

  贪心哲学家的寓言

  演示这种行为的原型示例是 Peter Welch 传授描写的"聪明人没有鸡肉".在这个场景中考虑的系统是一所由五位哲学家、一位厨师和一个食堂构成的学院.全部的哲学家(除了一位)都要想想(在代码示例中,考虑的时间是 3 秒)之后才去食堂取饭.而"贪心的"哲学家则不想把时间浪费在考虑上 —— 相反,他一次又一次地回到食堂,计划拿到鸡肉来吃.

  厨师按照一批四份的定量预备鸡肉,每预备好一批,就送到食堂.贪心的哲学家不断地去厨房,但他老是错过食物!事情是这样的:他第一次到的时刻,时间太早,厨师还没开战.因此贪心的哲学家只好干等着(通过 wait() 办法调用).在开饭的时刻(通过 notify() 办法调用),贪心的哲学家再一次回到食堂列队等候.但是这次,在他前来等候的时刻,他的四位同事已经到了,所以他在食堂行列中的位置在他们背面.他的同事们把厨房送来的一批四份鸡肉全部拿走了,所以贪心的哲学家又要在一边等着了. 可怜(也大概是公道的) ,他永久处在这个循环之外.

  考证的问题

  普通来说,很难按照普通的标准对 Java 编程的多线程程序举行考证.一样,开辟自动化工具关于常见的并发问题(比方死锁、活动锁和资源耗尽)举行完好而简单的解析也不太简单——分外是在肆意 Java 程序中大概在贫乏并发的正式模子的时刻.

  更糟的是,并发性问题出了名的改变无穷、难于跟踪.每个 Java 开辟人员都曾经据说过(大概亲身编写过)这样的 Java 程序:经过严峻解析,并且正常运行了相当一段时间,没有表现出潜在的死锁.然后忽然有一天,问题发生了,后果弄得开辟团队阅历很多的不眠之夜来试图发现并修补根本缘由.

  一方面,多线程 Java 程序简单发生的错误非常不明显,有大概在肆意什么时刻发生.另一方面,完好有大概这些 bug 在程序中从不呈现.问题取决于一些不可知的因素.多线程程序的复杂本质,使得人们很难有效地对其举行考证.没有一套现成的法则可以找出多线程代码中的这类问题,也无法切当地证明这些问题不存在,这些招致很多 Java 开辟人员完好避开多线程利用程序的计划和开辟,即便用并发和并行的方法对系统举行建模会非常棒,他们也不利用多线程.

  确切想举行多线程编程的开辟人员普通预备好了以下一个或两个办理筹划(至少是一部份):

  长时间艰苦地测试代码,找出全部呈现的并发性问题,诚恳地但愿到利用程序真正运行地时刻已经发现并修复了全部这类问题.

  大量运行计划情势和为多线程编程成立的指导原则.但是,这类指导原则只在整个系统都按照它们的标准计划的时刻才有效,没有计划法则可以覆盖全部范例的系统.

  固然知道的人不多,但是关于编写(然后考证)精确的多线程利用程序这一问题,还有第三个选项.利用称为通信次序进程( Communicating Sequential Processes,CSP)的切确的线程同步的数学理论,可以在计划时最好地处理死锁和活动锁之类的问题.CSP 由 C.A.R. Hoare 与 20 世纪 70 年代后期计划,CSP 供应了有效的办法,证明用它的构造和工具构建的系统可免得除并发的常见问题.

  完毕语

  在这份面向 Java 程序员的 CSP 全面介绍中,我把重点放在降服多线程利用程序开辟常见问题的第一步上,即理解这些问题.我介绍了 Java 平台上目前支持的多线程编程构造,注释了它们的发源,谈论了这类程序大概会有的问题.我还注释了用正式理论在肆意的、大型的和复杂的利用程序中排除这些问题(即竞争冒险、死锁、活动锁和资源耗尽)大概证明这些问题不存在的艰难.


  以上是“<b>在Java平台上举行多线程编程的缺陷</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

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