新手有个小问题求教
java吧
全部回复
仅看楼主
level 2
艹_情殇灬 楼主
Bank类
public class Bank {
static int money = 1000;
Object lock = "a";
public void ATM(int money) {
synchronized(lock)
{
if(money == 100)
{
Bank.money -= money;
System.out.println("A取走100,剩余" + Bank.money);
}
if(money == 200)
{
Bank.money -= money;
System.out.println("B取走200,剩余" + Bank.money);
}
}
}
}
PersonA类
public class PersonA extends Thread {
Bank bank;
public PersonA(Bank bank) {
this.bank = bank;
}
@Override
public void run() {
while (bank.money >= 100) {
bank.ATM(100);
}
}
}
PersonB类
public class PersonB extends Thread{
Bank bank;
public PersonB(Bank bank) {
this.bank = bank;
}
@Override
public void run() {
while(bank.money >= 200) {
bank.ATM(200);
}
}
}
测试类
public class Demo {
public static void main(String[] args) {
Bank bank = new Bank();
Thread a = new PersonA(bank);
Thread b = new PersonB(bank);
a.start();
b.start();
}
}
输出结果:
B取走200,剩余800
B取走200,剩余600
B取走200,剩余400
B取走200,剩余200
B取走200,剩余0
A取走100,剩余-100
为什么最后Bank中money都为0了,A还会在取走一次钱??
2018年09月29日 03点09分 1
level 1
你的同步synchronized这个关键词并没有什么用,因为判断都是在外面做的,相当于脏数据了。改下ATM方法
public void ATM(int money) {
synchronized (lock) {
if (money == 100) {
if(Bank.money >= 100){
Bank.money -= money;
System.out.println("A取走100,剩余" + Bank.money);
}
}
if (money == 200) {
if(Bank.money >= 200){
Bank.money -= money;
System.out.println("B取走200,剩余" + Bank.money);
}
}
}
}
2018年09月29日 05点09分 3
我是了你的,好像脏读还死锁了 运行结果: A取走100,剩余700 B取走200,剩余700
2018年09月29日 09点09分
其实不是死锁,是因为把循环条件写进ATM了,那么A或者B就只执行一次取款了。
2018年09月29日 10点09分
level 1
亲,你是自学吗?
2018年09月29日 05点09分 4
学校有教,不过不用指望老师会会细讲多线程并发,都要自己学。
2018年09月29日 09点09分
level 3
回复 胡皋三 :[玫瑰][灯泡][哈哈]
2018年09月29日 06点09分 7
1