分享
 
 
 

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

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

摘要

开发者有时创建的多线程程序会生成错误值或产生其它希奇的行为。古怪行为一般出现在一个多线程程序没使用同步连载线程访问要害代码部份的时候。同步连载线程访问要害代码部份是什么意思呢?在这篇文章中解释了同步,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

{

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两行组成的列表。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有