synchronize 的三大作用:
1. 原子性:确保线程之间互斥地访问同步代码,每个线程访问期间不会被中断;
2. 可见性:确保共享变量的修改能够被其他线程及时看到,其实是通过 Java 内存模型中的 “对一个变量 unlock 操作之前,先同步到主内存中;如果对一个变量进行 lock 操作,则将会清空工作内存中此变量的值,在其他线程使用此变量前,需要重新从主内存中 load” 来保证的;
3. 有序性:有效解决重排序问题,代码按先后顺序执行,即 “一个 unlock 操作先行发生于后面的线程对同一个锁的 lock 操作”
synchronize 的三大用法:
1. 修饰实例方法:使用当前实例对象作为锁,进入同步代码前要获得当前实例对象的锁。
2. 修饰静态方法:使用当前类作为锁,进入同步代码前要获得当前类对象的锁。
3. 修饰代码块:自己指定加锁对象,可以是对象锁,也可以是类锁,进入同步代码块前要先获得指定的锁。