方式一 : 同步代码块
作用:把出现线程安全问题的核心代码给上锁。
原理:每次只能一个线程进入,执行完毕后自动解锁,其他线程才可以进来执行。
public void drawMoney(double money){ //先获取谁来取钱 String name = Thread.currentThread().getName(); //同步代码块 //this == acc 共享账户 synchronized (this) { //1. 判断账户是否够钱 if (this.money >= money){ //2. 取钱 System.out.println(name + "来取钱成功, 吐出" + money); this.money -= money; System.out.println(name+"取钱后剩余"+this.money); }else { //4. 余额不足 System.out.println(name+"来取钱,余额不足"); } } }
同步代码块是如何实现线程安全的?
对出现问题的核心代码使用synchronized进行加锁
每次只能一个线程占锁进入访问
==
同步代码块的同步锁对象有什么要求?
对于实例方法建议使用this作为锁对象。
对于静态方法建议使用字节码(类名.class)对象作为锁对象。
=====================
方式二 同步方法
作用:把出现线程安全问题的核心方法给上锁
原理:每次只能一个线程进入,执行完毕以后自动解锁,其他线程才可以进来执行。
修饰符 synchronized 返回值类型 方法名称(形参列表) { 操作共享资源的代码}
注意:
同步方法其实底层也是有隐式锁对象的,只是锁的范围是整个方法代码。
如果方法是实例方法:同步方法默认用this作为的锁对象。但是代码要高度面向对象!
如果方法是静态方法:同步方法默认用类名.class作为的锁对象。