线程同步练习:存钱问题
2023-06-13 09:17:20 时间
1、问题描述
有两个储户分别向同一个账户存3000元,每次存1000,存3次。每次存完打印账户余额。 问题:该程序是否有安全问题,如果有,如何解决? 提示:
1,明确哪些代码是多线程运行代码,须写入run()方法 2,明确什么是共享数据。 3,明确多线程运行代码中哪些语句是操作共享数据的。
2、分析
1.是否是多线程问题? 是,两个储户线程 2.是否有共享数据? 有,账户(或账户余额) 3.是否有线程安全问题?有 4.需要考虑如何解决线程安全问题?同步机制:有三种方式(同步代码块、同步方法、Lock锁)。
3、实例代码:
这里用同步方法解决
class Account{
private double balance;
public Account(double balance) {
this.balance = balance;
}
//存钱
public synchronized void deposit(double amt){
if(amt > 0){
balance += amt;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":存钱成功。余额为:" + balance);
}
}
}
class Customer extends Thread{
private Account acct;
public Customer(Account acct) {
this.acct = acct;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
acct.deposit(1000);
}
}
}
public class AccountTest {
public static void main(String[] args) {
Account acct = new Account(0);
Customer c1 = new Customer(acct);
Customer c2 = new Customer(acct);
c1.setName("甲");
c2.setName("乙");
c1.start();
c2.start();
}
}
线程的执行顺序不唯一,所以打印的有稍微差别
相关文章
- c# 非阻塞算法_c# – 了解非阻塞线程同步和Thread.MemoryBarrier
- 【说站】python threading线程同步如何实现
- 进程的同步、互斥、通信的区别,进程与线程同步的区别
- c 线程安全的单例模式-c多线程并发处理方式_Java多线程面试题:线程锁+线程池+线程同步等
- 并发和并行、线程和进程,异步和同步之间到底是什么关系?
- 精准计时,北斗GPS网络时间同步带领迈入精准时钟
- distcp 并行同步脚本
- 【Java 集合】Java 集合的线程安全性 ( 加锁同步 | java.utils 集合 | 集合属性 | java.util.concurrent 集合 | CopyOnWrite 机制 )
- Linux线程同步与互斥(一)
- MySQL如何实时同步数据到ES?试试这款阿里开源的神器
- Python线程-线程的同步(三)
- 搭建Git服务器并实现自动同步到Web站点目录
- synchronized 线程同步详解编程语言
- Linux系统下信号量与线程同步(linux信号量线程)
- 建立Redis主从同步环境(redis主从搭建)
- Linux线程间信号量:实现深度同步(linux线程间信号量)
- 如何在Linux服务器上同步时间(linux服务器时间同步)
- Linux下线程同步的信号量实现(linux线程信号量)
- MySQL 数据同步解决方案(mysql数据同步方案)
- mongodb之旅实现数据同步(mongodb同步)
- Linux 互斥量:实现线程间同步的必要条件(互斥量 linux)
- 利用Redis实现线程同步(线程里面用redis)
- 实现分布式系统间Redis数据同步(分布式redis同步数据)
- 构建健壮的多个Redis数据同步系统(多个redis数据同步)
- 实现分布式环境下Redis集群数据同步(redis集群同步机制)
- 增强Redis跨网段同步性能(redis跨网段同步)
- C#线程同步的三类情景分析