1. 银行账户的存取款
业务场景:银行系统中,用户可能同时进行存款和取款操作。为了确保账户余额的准确性,我们需要保证存款和取款操作的线程安全。
示例代码
public class BankAccount {
private int balance = 0;
// 存款操作
public synchronized void deposit(int amount) {
if (amount > 0) {
balance += amount;
System.out.println("Deposited " + amount + ", new balance: " + balance);
}
}
// 取款操作
public synchronized void withdraw(int amount) {
if (amount > 0 && balance >= amount) {
balance -= amount;
System.out.println("Withdrew " + amount + ", new balance: " + balance);
} else {
System.out.println("Insufficient funds to withdraw " + amount);
}
}
public synchronized int getBalance() {
return balance;
}
}
业务操作:
- 业务员 A 在账户上进行存款操作,增加了 100 元。
- 业务员 B 在账户上进行取款操作,尝试提取 50 元。
- 由于
synchronized
的保护,存款和取款操作会依次进行,确保账户余额的一致性。
2. 订单处理系统
业务场景:电商平台的订单处理系统中,多个业务员可能同时处理订单。为了确保订单的正确处理和库存的一致性,需要对订单处理操作进行同步控制。
示例代码
public class OrderService {
private final Object lock = new Object();
private int stock = 100;
// 处理订单
public void processOrder(int orderQuantity) {
synchronized (lock) {
if (stock >= orderQuantity) {
stock -= orderQuantity;
System.out.println("Processed order of " + orderQuantity + ", remaining stock: " + stock);
} else {
System.out.println("Insufficient stock to process order of " + orderQuantity);
}
}
}
public int getStock() {
return stock;
}
}
业务操作:
- 业务员 A 处理了一笔订单,需要 20 件商品。
- 业务员 B 也同时处理了一笔订单,需要 30 件商品。
- 由于使用了
synchronized
,两个订单会顺序处理,确保库存不会出现负数。
3. 票务系统
业务场景:在一个票务系统中,多个业务员可能同时尝试购买同一场演出的门票。为了防止超卖,需要对票务销售进行同步控制。
示例代码
public class TicketService {
private int availableTickets = 50;
// 购买票务
public synchronized void buyTicket(int numberOfTickets) {
if (availableTickets >= numberOfTickets) {
availableTickets -= numberOfTickets;
System.out.println("Successfully bought " + numberOfTickets + " tickets, remaining tickets: " + availableTickets);
} else {
System.out.println("Not enough tickets available to buy " + numberOfTickets + " tickets");
}
}
public int getAvailableTickets() {
return availableTickets;
}
}
业务操作:
- 业务员 A 尝试购买 10 张票。
- 业务员 B 尝试购买 20 张票。
- 由于
synchronized
的保护,确保在处理购买请求时票数不会出现不一致,避免了超卖的情况。
4. 库存管理系统
业务场景:在一个库存管理系统中,多个业务员可能同时更新库存数据。为了避免数据不一致,需要对库存更新操作进行同步控制。
示例代码
public class InventoryService {
private final Object lock = new Object();
private int inventoryLevel = 200;
// 更新库存
public void updateInventory(int amount) {
synchronized (lock) {
inventoryLevel += amount;
System.out.println("Updated inventory by " + amount + ", new inventory level: " + inventoryLevel);
}
}
public int getInventoryLevel() {
return inventoryLevel;
}
}
业务操作:
- 业务员 A 增加库存 50 件。
- 业务员 B 减少库存 30 件。
- 由于
synchronized
的保护,库存的增减操作会按照顺序执行,确保库存数据的一致性。
总结
在以上示例中,synchronized
用于确保多线程环境下的业务操作能够安全进行,防止数据不一致和并发问题。它确保每次只有一个线程可以访问被 synchronized
修饰的代码块或方法,从而保护共享资源的完整性。