我写了个简单的多线程银行存取款代码,但是从synchronized代码块改为lock锁后输出顺序异常,求帮忙找问题所在。

那_年 2016-11-19 04:08:11
这是用synchronized代码块的正常代码。

//简单的银行存取款代码,实现5个人随机存取1元,同时进行。并显示银行余额和个人余额
//每个人初始有100元,银行初始有1000元。
public class Bank_Cun_Qu {
public static void main(String[] args){
Bank_User u1=new Bank_User("小刘",100);
Bank_User u2=new Bank_User("小张",100);
Bank_User u3=new Bank_User("小李",100);
Bank_User u4=new Bank_User("小红",100);
Bank_User u5=new Bank_User("小明",100);
Thread t1=new Thread(u1);
Thread t2=new Thread(u2);
Thread t3=new Thread(u3);
Thread t4=new Thread(u4);
Thread t5=new Thread(u5);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
//简单多线程的银行存取款,多个人随机存取,数据类型都设为int
class Bank{
private static Bank bank=new Bank();
private int monny;
private Bank(){
this.monny=1000;
}
public static Bank getBank(){
return bank;
}
public void bank_Cun(int monny){
this.monny=this.monny+monny;
System.out.println(",银行目前总存款为+++:"+this.monny);
}
public void bank_Qu(int monny){
this.monny=this.monny-monny;
System.out.println(",银行目前总存款为---:"+this.monny);
}

}
class Bank_User implements Runnable{
private Bank bank=Bank.getBank();
private int monny;
private String name;
public Bank_User(String name,int monny){
this.monny=monny;
this.name=name;
}
public void run(){
int i=30;
while(i>0){
int x=(int)(Math.random()*2);
synchronized(Clock.clock) {
if(x==1){
user_Cun();
}
else
user_Qu();
}
i--;
}

}
private void user_Cun(){
this.monny++;
System.out.printf(name+"存款1元,现在账户余额为+++:"+this.monny);
bank.bank_Cun(1);

}
private void user_Qu(){
if(this.monny>=1){
this.monny--;
System.out.printf(name+"取款1元,现在账户余额为---:"+this.monny);
bank.bank_Qu(1);
}
}
}

class Clock{
public static final Object clock=new Clock();
}


输出为:
小张取款1元,现在账户余额为---:99,银行目前总存款为---:999
小明存款1元,现在账户余额为+++:101,银行目前总存款为+++:1000
小李存款1元,现在账户余额为+++:101,银行目前总存款为+++:1001
小李取款1元,现在账户余额为---:100,银行目前总存款为---:1000
小李取款1元,现在账户余额为---:99,银行目前总存款为---:999
小李取款1元,现在账户余额为---:98,银行目前总存款为---:998
小李取款1元,现在账户余额为---:97,银行目前总存款为---:997
小李存款1元,现在账户余额为+++:98,银行目前总存款为+++:998
小李存款1元,现在账户余额为+++:99,银行目前总存款为+++:999
小李存款1元,现在账户余额为+++:100,银行目前总存款为+++:1000
小李存款1元,现在账户余额为+++:101,银行目前总存款为+++:1001
小红取款1元,现在账户余额为---:99,银行目前总存款为---:1000
小红存款1元,现在账户余额为+++:100,银行目前总存款为+++:1001
小红存款1元,现在账户余额为+++:101,银行目前总存款为+++:1002
小红存款1元,现在账户余额为+++:102,银行目前总存款为+++:1003
小红存款1元,现在账户余额为+++:103,银行目前总存款为+++:1004
小红取款1元,现在账户余额为---:102,银行目前总存款为---:1003
小红存款1元,现在账户余额为+++:103,银行目前总存款为+++:1004
小红取款1元,现在账户余额为---:102,银行目前总存款为---:1003
小红存款1元,现在账户余额为+++:103,银行目前总存款为+++:1004
小刘存款1元,现在账户余额为+++:101,银行目前总存款为+++:1005
小刘取款1元,现在账户余额为---:100,银行目前总存款为---:1004
小刘取款1元,现在账户余额为---:99,银行目前总存款为---:1003
小红取款1元,现在账户余额为---:102,银行目前总存款为---:1002
小李存款1元,现在账户余额为+++:102,银行目前总存款为+++:1003
小李取款1元,现在账户余额为---:101,银行目前总存款为---:1002
小明取款1元,现在账户余额为---:100,银行目前总存款为---:1001
小张取款1元,现在账户余额为---:98,银行目前总存款为---:1000
小明存款1元,现在账户余额为+++:101,银行目前总存款为+++:1001
小李存款1元,现在账户余额为+++:102,银行目前总存款为+++:1002
小红取款1元,现在账户余额为---:101,银行目前总存款为---:1001
小刘取款1元,现在账户余额为---:98,银行目前总存款为---:1000
小红取款1元,现在账户余额为---:100,银行目前总存款为---:999
小李取款1元,现在账户余额为---:101,银行目前总存款为---:998
小明取款1元,现在账户余额为---:100,银行目前总存款为---:997
小张取款1元,现在账户余额为---:97,银行目前总存款为---:996


改为lock锁后的代码


package tongbu1;

import java.util.concurrent.locks.*;

//简单的银行存取款代码,实现5个人随机存取1元,同时进行。并显示银行余额和个人余额
//每个人初始有100元,银行初始有1000元。
public class Bank_Cun_Qu {
public static void main(String[] args) {
Bank_User u1 = new Bank_User("小刘", 100);
Bank_User u2 = new Bank_User("小张", 100);
Bank_User u3 = new Bank_User("小李", 100);
Bank_User u4 = new Bank_User("小红", 100);
Bank_User u5 = new Bank_User("小明", 100);
Thread t1 = new Thread(u1);
Thread t2 = new Thread(u2);
Thread t3 = new Thread(u3);
Thread t4 = new Thread(u4);
Thread t5 = new Thread(u5);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}

// 简单多线程的银行存取款,多个人随机存取,数据类型都设为int
class Bank {
private static Bank bank = new Bank();
private int monny;

private Bank() {
this.monny = 1000;
}

public static Bank getBank() {
return bank;
}

public void bank_Cun(int monny) {
this.monny = this.monny + monny;
System.out.println(",银行目前总存款为+++:" + this.monny);
}

public void bank_Qu(int monny) {
this.monny = this.monny - monny;
System.out.println(",银行目前总存款为---:" + this.monny);
}

}

class Bank_User implements Runnable {
private Bank bank = Bank.getBank();
private int monny;
private String name;

//****************修改部分*******************
private Lock lock = new ReentrantLock();
//****************修改部分*******************

public Bank_User(String name, int monny) {
this.monny = monny;
this.name = name;
}

public void run() {
int i = 30;
while (i > 0) {
int x = (int) (Math.random() * 2);

//****************修改部分*******************
lock.lock();
try {

if (x == 1) {
user_Cun();
} else
user_Qu();
} finally {
lock.unlock();// 这个结果是显示错误的
}

//****************修改部分*******************
i--;
}

}

private void user_Cun() {
this.monny++;
System.out.printf(name + "存款1元,现在账户余额为+++:" + this.monny);
bank.bank_Cun(1);

}

private void user_Qu() {
if (this.monny >= 1) {
this.monny--;
System.out.printf(name + "取款1元,现在账户余额为---:" + this.monny);
bank.bank_Qu(1);
}
}
}




输出结果显示为:

小李存款1元,现在账户余额为+++:101小红取款1元,现在账户余额为---:99,银行目前总存款为---:1000
小红存款1元,现在账户余额为+++:100,银行目前总存款为+++:1001
小红存款1元,现在账户余额为+++:101,银行目前总存款为+++:1002
小红取款1元,现在账户余额为---:100小明取款1元,现在账户余额为---:99,银行目前总存款为---:1000
小明取款1元,现在账户余额为---:98,银行目前总存款为---:999
小明取款1元,现在账户余额为---:97,银行目前总存款为---:998
小明取款1元,现在账户余额为---:96,银行目前总存款为---:997
小张取款1元,现在账户余额为---:99,银行目前总存款为---:996
小刘存款1元,现在账户余额为+++:101小张取款1元,现在账户余额为---:98,银行目前总存款为---:996
小张取款1元,现在账户余额为---:97,银行目前总存款为---:995
小张取款1元,现在账户余额为---:96,银行目前总存款为---:994
小张取款1元,现在账户余额为---:95,银行目前总存款为---:993
小张取款1元,现在账户余额为---:94,银行目前总存款为---:992
小明取款1元,现在账户余额为---:95,银行目前总存款为---:991
小明存款1元,现在账户余额为+++:96,银行目前总存款为+++:992
小明取款1元,现在账户余额为---:95,银行目前总存款为---:991
小明存款1元,现在账户余额为+++:96,银行目前总存款为+++:992
小明存款1元,现在账户余额为+++:97,银行目前总存款为+++:993
小明存款1元,现在账户余额为+++:98,银行目前总存款为+++:994
小明取款1元,现在账户余额为---:97,银行目前总存款为---:993
小明取款1元,现在账户余额为---:96,银行目前总存款为---:992
小明取款1元,现在账户余额为---:95,银行目前总存款为---:1001
小红取款1元,现在账户余额为---:99,银行目前总存款为---:990
小红取款1元,现在账户余额为---:98,银行目前总存款为---:989
小红取款1元,现在账户余额为---:97,银行目前总存款为+++:1001
,银行目前总存款为---:988
,银行目前总存款为---:991



求帮忙解疑,为什么输出会换行?是finally的问题吗?
...全文
285 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧