synchronized 同步锁业务场景介绍

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 修饰的代码块或方法,从而保护共享资源的完整性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值