当前位置:编程学习 > JAVA >>

互斥的存/取款线程设计,为什么运行一直没有想要的结果?

运行结果总是:
Wang账户:现有0.0,存入100.0,余额100.0
Wang账户:现有100.0,取走100.0,余额0.0
Wang账户:现有0.0,存入200.0,余额200.0
我希望的是:
存100
存200
取300
一直运行没有这样的结果。

public class SaveLock extends Thread 
{
private Account account;
private double value;
public SaveLock(Account a1,double value)
{
this.account=a1;
this.value=value;
}
public void run()
{
synchronized(this.account)
{
double howmuch=this.account.balance();
try
{
sleep(1);
}
catch(InterruptedException e){}
this.account.put(this.value);
System.out.println(this.account.getName()+"账户:现有"+howmuch+",存入"+this.value+",余额"+this.account.balance());
}
}
}
class FetchLock extends Thread
{
private Account account;
private double value;
public FetchLock(Account a1,double value)
{
this.account=a1;
this.value=value;
}
public void run()
{
synchronized(this.account)
{
double howmuch=this.account.balance();
try
{
sleep(1);
}
catch(InterruptedException e){}
System.out.println(this.account.getName()+"账户:现有"+howmuch+",取走"+this.account.get(this.value)+",余额"+this.account.balance());
}
}
public static void main(String args[])
{
Account wang=new Account("Wang");
new SaveLock(wang,100).start();
new SaveLock(wang,200).start();
new FetchLock(wang,300).start();
}
}

class Account 
{
private String name;
private double balance;
public Account(String name)
{
this.name=name;
this.balance=0;
}
public String getName()
{
return name;
}
public double balance()
{
return balance;
}
public void put(double value)
{
if(value>0)
this.balance+=value;
}
public double get(double value)
{
if(value>0)
{
if(value<=this.balance)
this.balance-=value;
else
{
value=this.balance;
this.balance=0;
}
return value;
}
return 0;
}

}
--------------------编程问答-------------------- 建议看下这个。 --------------------编程问答-------------------- 这个是书上的例子,书里的运行结果就是对的。 --------------------编程问答--------------------        new SaveLock(wang,100).start();
        new SaveLock(wang,200).start();
        new FetchLock(wang,300).start();

你这3个顺序没有控制,所以是随机的。 --------------------编程问答--------------------
引用 3 楼 zhuweisyyc 的回复:
       new SaveLock(wang,100).start();
        new SaveLock(wang,200).start();
        new FetchLock(wang,300).start();

你这3个顺序没有控制,所以是随机的。

3个线程是随机的,但是为什么运行结果总是固定的(存、取、存),而且一次没有出现我想要的结果呢(存、存、取)? --------------------编程问答--------------------

//我把sleep的时间延长到10;多开了几个进程,执行的顺序每次是15432,debug单步执行是12345
//可能是synchronized排队顺序的原因,先进后出
        Account wang=new Account("Wang");
        new SaveLock(wang,1000).start();//1
        new SaveLock(wang,200).start();//2
        new FetchLock(wang,300).start();//3
        new FetchLock(wang,400).start();//4
        new SaveLock(wang,100).start();//5
--------------------编程问答--------------------
引用 5 楼 gagewang1 的回复:

//我把sleep的时间延长到10;多开了几个进程,执行的顺序每次是15432,debug单步执行是12345
//可能是synchronized排队顺序的原因,先进后出
        Account wang=new Account("Wang");
        new SaveLock(wang,1000).start();//1
        new SaveLock(wang,200).start();//2
        new FetchLock(wang,300).start();//3
        new FetchLock(wang,400).start();//4
        new SaveLock(wang,100).start();//5

感觉有点复杂了,这个线程的调度不是操作系统的事吗?跟Java的synchronized实现机制也有关系?
我为new的一个FetchLock对象设置低优先级,奇怪它也不是最后执行的。 --------------------编程问答-------------------- --------------------编程问答-------------------- ●一天晚上和几个朋友喝酒,几个人都喝多了.一个到在路边睡着了,我们也抬不动他,就商量给他找些东西盖上,别着凉了.几天后见到他,他说第二天醒来发现身上放着三辆自行车。 --------------------编程问答-------------------- 这个代码没写对吧 ,Account类写的不清楚啊,FecthLock 里面什么没做就出来了。 --------------------编程问答--------------------
引用 9 楼 pangjingji 的回复:
这个代码没写对吧 ,Account类写的不清楚啊,FecthLock 里面什么没做就出来了。

main()在FetchLock 类里,java FetchLock 可以运行的。
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,