本文共 1460 字,大约阅读时间需要 4 分钟。
在多线程编程中,资源共享与竞争可能导致意想不到的行为。为了确保程序的健壮性,我们需要采取适当的同步机制。以下是关于Java多线程安全的一个典型示例。
在本文中,我们创建了一个 Account 类来模拟一个银行账户。该类包含两个成员变量:balance(账户余额)和 password(账户密码)。为了确保这些成员变量的安全访问,我们使用了细粒度锁策略。
余额资源的保护
final Object 对象 balLock 作为锁。withdraw() 和 getBalance() 方法对 balLock 进行同步,确保在访问账户余额时,其他线程无法进行操作。密码资源的保护
final Object 对象 pwLock。updatePassword() 和 getPassword() 方法对 pwLock 进行同步,确保密码的修改和查询操作不会互相干扰。以下是 Account 类的完整代码:
class Account { // 保护账户余额的锁 private final Object balLock = new Object(); private Integer balance; // 保护账户密码的锁 private final Object pwLock = new Object(); private String password; // 取款操作 void withdraw(Integer amt) { synchronized (balLock) { if (this.balance > amt) { this.balance -= amt; } } } // 查看余额操作 Integer getBalance() { synchronized (balLock) { return balance; } } // 修改密码操作 void updatePassword(String pw) { synchronized (pwLock) { this.password = pw; } } // 查看密码操作 String getPassword() { synchronized (pwLock) { return password; } }} 在实际应用中,可以根据具体需求对上述代码进行扩展和优化。例如,可以增加密码的验证机制,确保新密码的合法性;或者在 withdraw() 方法中增加参数的校验,防止无效操作。
通过使用细粒度锁,我们可以确保不同资源的独立保护。在Java中,使用 synchronized 关键字配合 final Object 实例,可以有效地实现资源的互不干扰。这种方法不仅提高了程序的安全性,还减少了死锁的可能性。
转载地址:http://elqsz.baihongyu.com/