银行有一个账户。有两个储户分别向同一个账户存3000元,每次存1000,存3次。每次存完打印账户余额。效果要是交替打印!

本文通过一个多线程存款模拟程序,展示了如何使用Java实现两个账户交替向同一账户存款的过程,并确保了每次存款后的余额正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*银行有一个账户。有两个储户分别向同一个账户存3000元,每次存1000,存3次。每次存完打印账户余额。注意:效果要是交替打印!(多线程实现)*/
class  cun implements Runnable{
	int sum=0;
	int a = 0;
	int b =0;
	Lock loc = new ReentrantLock();
	static boolean bool=true;
	public  void run(){
		for(int i=1;i<=6;i++){
			synchronized(this){
			notify();//先唤醒另一个线程
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if(sum<6000){
			sum+=1000;
				if(Thread.currentThread().getName().equals("账户一")){
					a+=1000;
					System.out.println(Thread.currentThread().getName()+"目前存了"+a);
				}else{
					b+=1000;
					System.out.println(Thread.currentThread().getName()+"目前存了"+b);
				}
			
			System.out.println("目前余额"+sum);
			try {
				wait();//打印完后等待下一次被唤醒
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
			}
		}
	}
	
}
public class Test {
	public static void main(String[] args) {
		cun c = new cun();
		Thread t1 = new Thread(c,"账户一");
		Thread t2 = new Thread(c,"账户二");
		t1.start();
		t2.start();
	}
}




                
这个问题可以利用多线程来模拟两个储户同时款的情况。每个储户对应一个线程,他们各自对账户余额进行操作。然而,由于直接修改共享的账户余额变量可能会导致数据竞争(Data Race),即多个线程同时访问并修改同一个资源,这将引发不确定的结果。 为了保证线程安全性,我们可以采取以下几种解决方案: 1. **使用synchronized关键字**:在修改账户余额的地方添加锁(通常用synchronized修饰该方法或变量)。例如,将`updateBalance`方法设置为同步的,确保在同一时刻只有一个线程能进入这个方法。 ```java private int balance = 0; private Object lock = new Object(); public void deposit(int amount) { synchronized(lock) { balance += amount; System.out.println("Deposit: " + amount + ", New Balance: " + balance); } } // 示例调用 new Thread(() -> deposit(1000)).start(); new Thread(() -> deposit(1000)).start(); ``` 2. **使用并发容器(如ConcurrentHashMap或AtomicInteger)**:如果经常需要读写,可以考虑使用Java提供的并发数据结构,它们天生就是线程安全的。 ```java import java.util.concurrent.atomic.AtomicInteger; public class Account { private AtomicInteger balance; public Account() { this.balance = new AtomicInteger(0); } public void deposit(int amount) { balance.addAndGet(amount); System.out.println("Deposit: " + amount + ", Current Balance: " + balance.get()); } } Account account = new Account(); new Thread(() -> account.deposit(1000)).start(); new Thread(() -> account.deposit(1000)).start(); ``` 3. **使用CountDownLatch或Semaphore**:如果款操作不是立即成,而是有一个异步过程,可以使用这些工具来控制线程的结束。 以上方案都可以确保在多线程环境中账户余额的更新是正确的。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值