解决多线程安全性问题的方法
目录
案例要求:
实现思路:
法一:同步代码块
方法二:同步方法
方法三:Lock锁
代码:
方法一:同步代码块
方法二:同步方法
方法三:Lock锁
总结:
案例要求:
实现思路:
法一:同步代码块
方法二:同步方法
方法三:Lock锁
代码:
方法一:同步代码块
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Card {private String name;private int money;public void getMoney(int money){synchronized (this) {System.out.println("开始取钱"+money+"元");if(this.money>=money){System.out.println(name+"取钱成功,取钱金额为"+money);this.money-=money;System.out.println("余额为"+this.money);}else{System.out.println("取钱失败,余额不足");}}}
}
方法二:同步方法
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Card {private String name;private int money;public synchronized void getMoney(int money){System.out.println("开始取钱"+money+"元");if(this.money>=money){System.out.println(name+"取钱成功,取钱金额为"+money);this.money-=money;System.out.println("余额为"+this.money);}else{System.out.println("取钱失败,余额不足");}}
}
方法三:Lock锁
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Card {private String name;private int money;private final Lock lk=new ReentrantLock();public synchronized void getMoney(int money){String name=Thread.currentThread().getName();System.out.println(name+"开始取钱"+money+"元");lk.lock();try {if(this.money>=money){System.out.println(name+"取钱成功,取钱金额为"+money);this.money-=money;System.out.println("余额为"+this.money);}else{System.out.println("取钱失败,余额不足");}} finally {lk.unlock();}}
}
总结:
本文展示了三种实现线程安全的Java取钱操作方案:1.同步代码块,使用synchronized(this)包裹关键代码;2.同步方法,直接在方法声明添加synchronized关键字;3.Lock锁机制,通过ReentrantLock实现更灵活的锁控制。三种方法都能有效解决多线程并发访问时的数据一致性问题,其中Lock锁提供了更细粒度的控制,需注意在finally块中释放锁。实现思路均围绕保证取钱操作的原子性展开,确保余额判断和扣款操作的完整性。