目录
一、同步锁
synchronized
同步锁:依赖JVM来实现;
优缺点:不可中断,适合竞争不激烈的场景,可读性号;Lock
:依赖特殊的CPU指令、代码来实现,如ReentrantLock
优缺点:可中断锁,多样化同步,适合竞争激烈的场景,能维持常态;
二、synchronized 常见四种用法:
- 修饰代码块:大括号括起的代码,作用于调用的对象;
- 修饰方法【同步方法】:整个方法,作用于调用的对象;
- 修饰静态方法:整个静态方法,作用于所有对象;
- 修饰类:括号括起来的部分,作用于所有对象;
父类有同步方法时,当子类继承父类该方法时,子类方法不带synchronized
同步特性。因为synchronized
不是声明式的关键字,如果子类想要同步该方法时,需要显示设置synchronized
;
JMM关于synchronized
的两条规定:
- 线程解锁前,必须把共享变量的最新值刷新到主内存中;
- 线程加锁前,将清空工作内存中共享变量的值,从而保证在使用共享变量时,从主内存中重新读取到最新的值;
@Slf4j
public class SynchronizedExample2 {
/**
* 修饰一个类
*/
public static void test1(int j){
synchronized (SynchronizedExample1.c