WEB开发网      濠电姷鏁告繛鈧繛浣冲洤纾瑰┑鐘宠壘閻ょ偓銇勯幇鍫曟闁稿鍠愰妵鍕冀閵娧佲偓鎺楁⒒閸曨偄顏柡宀嬬畱铻e〒姘煎灡绗戦梻浣筋嚙濮橈箓顢氳濠€浣糕攽閻樿宸ュΔ鐘叉啞缁傚秹宕滆绾惧ジ寮堕崼娑樺缂佹宀搁弻鐔风暋閻楀牆娈楅梺璇″枓閺呯姴鐣疯ぐ鎺濇晝闁靛牆妫欓蹇旂節閻㈤潧浠﹂柛銊ョ埣楠炴劙骞橀鑲╋紱闂佽宕樼粔顔裤亹閹烘挸浜归梺缁樺灦閿曗晛螞閸曨垱鈷戦柟鑲╁仜婵″ジ鎮楀☉鎺撴珖缂侇喖顑呴鍏煎緞濡粯娅囬梻浣瑰缁诲倿寮绘繝鍥ㄦ櫇闁稿本绋撻崢鐢告煟鎼淬垻鈯曢柨姘舵煟韫囥儳绋荤紒缁樼箖缁绘繈宕橀妸褌绱濋梻浣筋嚃閸ㄤ即宕弶鎴犳殾闁绘梻鈷堥弫鍌炴煕閳锯偓閺呮瑧妲愬Ο琛℃斀闁绘劕妯婇崵鐔封攽椤旇棄鍔ら摶鐐烘煕閺囥劌澧柛娆忕箻閺屽秹宕崟顒€娅g紓浣插亾濠㈣泛顑囩粻楣冩煙鐎涙ḿ绠橀柨娑樼У椤ㄣ儵鎮欓鍕紙闂佽鍠栫紞濠傜暦閹偊妲诲┑鈩冨絻椤兘寮诲☉銏犖╅柕澶堝労閸斿绱撴担绋库偓鍝ョ矓瑜版帒鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘 ---闂傚倸鍊烽悞锔锯偓绗涘厾娲煛閸涱厾顔嗛梺璺ㄥ櫐閹凤拷
开发学院WEB开发Jsp 用Java线程获取优异性能(II)??使用同步连载线程... 阅读

用Java线程获取优异性能(II)??使用同步连载线程访问关键代码部份

 2008-01-05 19:08:16 来源:WEB开发网 闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�闂傚倸鍊风粈渚€骞夐敓鐘插瀭闁汇垹鐏氬畷鏌ユ煙閹殿喖顣奸柛搴$У閵囧嫰骞掗幋婵冨亾閻㈢ǹ纾婚柟鐐灱濡插牊绻涢崱妤冃℃繛宀婁簽缁辨捇宕掑鎵佹瀸闂佺懓鍤栭幏锟�濠电姷鏁告慨顓㈠箯閸愵喖宸濇い鎾寸箘閹规洟姊绘笟鈧ḿ褍煤閵堝悿娲Ω閳轰胶鍔﹀銈嗗笂閼冲爼鍩婇弴銏$厪闁搞儮鏅涙禒褏绱掓潏鈺佷槐闁轰焦鎹囬弫鎾绘晸閿燂拷闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�  闂傚倸鍊烽懗鑸电仚缂備胶绮〃鍛村煝瀹ュ鍗抽柕蹇曞У閻庮剟姊虹紒妯哄闁诲繑姘ㄩ埀顒佸嚬閸撶喎顫忓ú顏勫瀭妞ゆ洖鎳庨崜浼存⒑闁偛鑻晶顔剧磼婢跺﹦绉虹€殿喖顭锋俊姝岊槷闁稿鎹囧Λ鍐ㄢ槈濞嗗繑娈橀梻浣风串缂嶁偓濞存粠鍓熼崺鈧い鎺戝€归弳顒勬煕鐎n亷韬€规洑鍗冲鍊燁槾闁哄棴绠撻弻銊╂偆閸屾稑顏�
核心提示:摘要 开发者有时创建的多线程程序会生成错误值或产生其它希奇的行为,古怪行为一般出现在一个多线程程序没使用同步连载线程访问要害代码部份的时候,用Java线程获取优异性能(II)??使用同步连载线程访问关键代码部份,同步连载线程访问要害代码部份是什么意思呢?在这篇文章中解释了同步,java的同步机制,在每个线程的分配之后打

  摘要
开发者有时创建的多线程程序会生成错误值或产生其它希奇的行为。古怪行为一般出现在一个多线程程序没使用同步连载线程访问要害代码部份的时候。同步连载线程访问要害代码部份是什么意思呢?在这篇文章中解释了同步,java的同步机制,以及当开发者没有正确使用这个机制时出现的两个问题。一旦你看完这篇文章,你就可以避免在你的多线程Java程序中因缺乏同步而产生的希奇行为。
创建多线程Java程序难吗?仅从《用Java线程获取优异性能(I)》中获得的信息你就可以回答,不。究竟,我已经向你显示了如何轻松地创建线程对象,通过调用Thread的start()方法起动与这些对象相关的线程,以及通过调用其它Thread方法,比如三个重载的join()方法执行简单的线程操作。至今仍有许多开发者在开发一些多线程程序时面临困难境遇。他们的程序经常功能不稳定或产生错误值。例如,一个多线程程序可能将不正确的雇员资料存贮在数据库中,比如姓名和地址。姓名可能属于一个雇员的,而地址却属于另一个的。是什么引起这种希奇行为的呢? 是缺乏同步:连载行为,或在同一时间排序,线程访问那些让多重线程操作的类和字段变量实例的代码序列,以及其他共享资源。我称这些代码序列为要害代码部份。
注重:不象类和实例字段变量,线程不能共享本地变量和参数。原因是:本地变量和参数在一个线程方法中分配??叫堆栈。结果,每一个线程都收到它自己对那些变量的拷贝。相反,线程能够共享类字段和实例字段因为那些变量在一个线程方法(叫堆栈)中没有被分配。取而代之,它们作为类(类字段)或对象(实例字段)的一部份在共享内存堆中被分配。
这篇文章将教你如何使用同步连载线程访问要害代码部份。我用一个说明为什么一些多线程程序必须使用同步的例子作为开始。我接下来就监视器和锁探讨Java的同步机制和synchronized 要害字。我通过研究由这样的错用产生的两个问题判定经常因为不正确的使用同步机制而否认了它的好处。
阅读关于线程程序的整个系列:
? 第I部份:介绍线程、线程类及Runnable
? 第II部份:使用同步连载线程访问要害代码部份
对于同步的需要
为什么我们需要同步呢?一种回答,考虑这个例子:你写一个使用一对线程模拟取款/存款金融事务的Java程序。在那个程序中,一个线程处理存款,同时其它线程正处理取款。每一个线程操作一对共享变量、类及实例字段变量,这些用来标识金融事务的姓名和账号。对于一个正确的金融事务,每一个线程必须在其它线程开始给name和amount赋值前(并且同时打印那些值)给name和amount变量赋值(并打印那些值,模拟存贮事务)。其源代码如下:
列表1. NeedForSynchronizationDemo.java
// NeedForSynchronizationDemo.java
class NeedForSynchronizationDemo
{
public static void main (String [] args)
{
FinTrans ft = new FinTrans ();
TransThread tt1 = new TransThread (ft, "Deposit Thread");
TransThread tt2 = new TransThread (ft, "Withdrawal Thread");
tt1.start ();
tt2.start ();
}
}
class FinTrans
{
public static String transName;
public static double amount;
}
class TransThread extends Thread
{
PRivate FinTrans ft;
TransThread (FinTrans ft, String name)
{
super (name); //保存线程名称
this.ft = ft; //保存对金融事务对象的引用
}
public void run ()
{
for (int i = 0; i < 100; i++)
{
if (getName ().equals ("Deposit Thread"))
{
//存款线程要害代码部份的开始
ft.transName = "Deposit";
try
{
Thread.sleep ((int) (Math.random () * 1000));
}
catch (InterruptedException e)
{
}
ft.amount = 2000.0;
System.out.println (ft.transName + " " + ft.amount);
//存款线程要害代码部份的结束
}
else
{
//取款线程要害代码部份的开始
ft.transName = "Withdrawal";
try
{
Thread.sleep ((int) (Math.random () * 1000));
}
catch (InterruptedException e)
{
}
ft.amount = 250.0;
System.out.println (ft.transName + " " + ft.amount);
//取款线程要害代码部份的结束
}
}
}
}
NeedForSynchronizationDemo的源代码有两个要害代码部份:一个可理解为存款线程,另一个可理解为取款线程。在存款线程要害代码部份中,线程分配Deposit String对象的引用给共享变量transName及分配2000.0 给共享变量amount。同样,在取款要害代码部份,线程分配Withdrawal String对象的引用给transName及分配250.0给amount。在每个线程的分配之后打印那些变量的内容。当你运行NeedForSynchronizationDemo时,你可能期望输出类似于Withdrawal 250.0 和Deposit 2000.0两行组成的列表。

Tags:Java 线程 获取

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接