wills2009 2013-12-06 01:47 采纳率: 0%
浏览 1960

JAVA中的 线程同步问题

如题,在下边的例子中,money的数据输出是有错误的,请针对money的输出写一个同步方法,解决问题。
本人刚开始学,不知道这个问题是什么意思,求哪位给解答一下!!!谢谢啦!

class Bank implements Runnable
{
int money=100; // 声明一个int型变量money,初值为100
Thread zhang,keven;
Bank()
{
zhang = new Thread(this); // 创建zhang,Bank对象为zhang的目标对象
zhang.setName("会计") ; // 设置zhang线程的名字为“会计”
keven=new Thread(this); // 创建keven,Bank对象为keven的目标对象
keven.setName("出纳") ;// 设置 keven线程的名字为“出纳”
}
public void run()

{

int i=0; // 声明一个int类型变量i,初值为0
while(true)
{
if(zhang.isAlive()) // 判断线程zhang是否正在占有CPU资源
{

i=i+1;
money=money+1;
System.out.printf("\n%s将money的值改为%d\t",zhang.getName(),money);
System.out.printf("%s的局部变量i=%d\n",zhang.getName(),i);
if(i>=6)
{
System.out.printf("%s线程进入死亡状态\n",zhang.getName());
return; // 使得线程zhang进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
}
}
else if((keven.isAlive()) ) // 判断线程keven是否正在占有CPU资源
{
i=i-1;
money=money-1;
System.out.printf("\n%s将money的值改为%d\t",keven.getName(),money);
System.out.printf("%s的局部变量i=%d\n",keven.getName(),i);
if(i<=-6)
{
System.out.printf("%s线程进入死亡状态\n",keven.getName());
return; // 使得线程keven进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
}
}
}
}
}
class BankExample
{
public static void main(String args[ ])
{
Bank bank=new Bank();
bank.zhang.start();
bank.keven.start();
}

}

  • 写回答

1条回答 默认 最新

  • cntaizi 2014-04-17 03:23
    关注

    i=i+1;
    money=money+1; 这快用快包起来用

    类似于

    synchronized(obj) {
    while(true)
    {
    if(zhang.isAlive()) // 判断线程zhang是否正在占有CPU资源
    {

    i=i+1;
    money=money+1;

    ... // 。。
    }

    或者写一个同步的静态方法也可以

    他主要的意思是你的money是线程不安全的

    评论

报告相同问题?

悬赏问题

  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程