当前页面: 开发资料首页 → Java 专题 → Java开发中多线程同步技巧
Java开发中多线程同步技巧
摘要: 本文对java编程中的多线程同步问题进行了探讨
<body bgcolor="#FFFFFF" text="#000000"> <table width="570" border="0" cellspacing="0" cellpadding="5" bgcolor="FBE392"> <tr> <td> <table width="570" border="0" cellspacing="0" cellpadding="5"> <tr> <td bgcolor="E1B004" width="200" align="center">天极IT资讯短信服务 电脑小技巧
<table width="100%" border="0" cellspacing="0" cellpadding="3" bgcolor="fffcc0"> function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } <form name=dn action="http://www.my5757.com/tj/join.jsp" target=_blank onSubmit="return check4()"> <tr valign=middle> <td>资费:包月5元
手机: <input type=text name=mobile size=11 style="border:1px solid #000000;height=16px"> <input type=image src="http://www.my5757.com/yesky/images/d34.gif" border="0" width="45" height="18" align="middle" name="image2" > </td> </tr> <input type=hidden name=stype value="yjq"> </form> </table> </td> <td width="370" bgcolor="FBC403">介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。(首月免费) </td> </tr> </table> </td> </tr> </table>
在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题。在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用。<iframe align=right marginWidth=0 marginHeight=0 src="http://images.chinabyte.com/adjs/iframe-pip/y-software-pip.html" frameBorder=0 width=360 scrolling=no height=300></iframe> 我们首先编写一个非常简单的多线程的程序,是模拟�
兄械亩喔鱿叱掏倍酝桓龃⑿钫嘶Ы写婵睢⑷】畈僮鞯摹�
在程序中我们使用了一个简化版本的Account类,代表了一个银行账户的信息。在主程序中我们首先生成了1000个线程,然后启动它们,每一个线程都对John的账户进行存100元,然后马上又取出100元。这样,对于John的账户来说,最终账户的余额应该是还是1000元才对。然而运行的结果却超出我们的想像,首先来看看我们的演示代码:
<table width="100%" bgColor=#ffffff>
<tr>
<td>class Account
{
String name; float amount;
public Account(String name, float amount)
{
this.name = name;
this.amount = amount;
}
public void deposit(float amt)
{
float tmp = amount;
tmp += amt;
try
{
Thread.sleep(100);
//模拟其它处理所需要的时间,比如刷新数据库等
}
catch (InterruptedException e)
{
// ignore
}
amount = tmp;
}
public void withdraw(float amt)
{
float tmp = amount;
tmp -= amt;
try
{
Thread.sleep(100);
//模拟其它处理所需要的时间,比如刷新数据库等
}
catch (InterruptedException e)
{
// ignore
}
amount = tmp;
}
public float getBalance()
{
return amount;
}
}
public class AccountTest
{
private static int NUM_OF_THREAD = 1000;
static Thread[] threads = new Thread[NUM_OF_THREAD];
public static void main(String[] args)
{
final Account acc = new Account("John", 1000.0f);
for (int i = 0; i< NUM_OF_THREAD; i++)
{
threads[i] = new Thread(new Runnable()
{
public void run()
{
acc.deposit(100.0f);
acc.withdraw(100.0f);
}
}
);
threads[i].start();
}
for (int i=0; i {
try { threads[i].join();
//等待所有线程运行结束
}
catch (InterruptedException e)
{
// ignore
}
}
System.out.println("Finally, John's balance is:" + acc.getBalance()); }}</td></tr></table>
↑返回目录
前一篇:
Java集合构架研究之一
后一篇:
EJB技术之旅(三)