线程同步
方式一 : 同步代码块
作用:把出现线程安全问题的核心代码给上锁。
原理:每次只能一个线程进入,执行完毕后自动解锁,其他线程才可以进来执行。
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作为的锁对象。