- 规则1:静态条件
在多线程下,没有依赖关系的代码,在执行共享变量读写操作(至少有一个线程写)时,并不能保证以编写顺序 (Program Order)执行,这称为发生了竞态条件(Race Condition)
注意:静态条件是为了更好的性能。
- 规则二:同步动作
同步动作 - 一个线程中代码的执行顺序 若要保证多线程下,每个线程的执行顺序(Synchronization Order)按编写顺序(Program Order)执行,那么 必须使用 Synchronization Actions 来保证,这些 SA 有
lock,unlock - synchronized, ReentrantLock
volatile 方式读写变量 - 保证可见性,防止重排序(它的主要作用)
VarHandle 方式读写变量
Synchronization Order 也称之为 Total Order
17、规则三:先行发生
线程切换时代码的顺序和可见性 若是变量读写时发生线程切换(例如,线程 1 写入 x,切换至线程 2,线程 2 读取 x)在这些边界的处理上如果有 action1 先于 action 2 发生,那么代码可以按确定的顺序执行,这称之为 Happens-Before Order 规则
用公式表达为:
含义为:如果 action1 先于 action2 发生,那么 action1 之前的共享变量的修改对于 action2 可见,且代码按 PO 顺序执行。
- 创建一个锁的对象
Static final Object lock = new Object();
加锁的动作:synchronized(lock){}
- 在jDK8以上我们可以直接在接口中实现静态方法和抽象方法
- 接口中的定义的方法是抽象方法
- 默认方法: default 方法类型 方法名(){
}
- 默认方法的调用我们要通过当前接口的实例化对象来进行调用
- 静态方法: static 方法的类型 方法名(){
}
- 静态方法可以在接口中调用
- 接口中的静态方法是不允许重写的
- 规则4:因果律
因果律:代码之间如存在依赖关系,即使没有加 SA(同步动作) 操作,代码的执行顺序也是可以预见的
19、
20、