synchronized
- 使用方式分类
- 方法:
- 修饰实例方法,被锁对象为类的
当前实例对象
。 - 修饰静态方法,被锁对象为
类对象
,即该类的所有实例
,调用该方法时都需要排队。
- 修饰实例方法,被锁对象为类的
- 代码块
- 锁实例对象,类的实例对象。即锁住这个实例对象。
- class对象,锁住这一类的对象,不一定是自己,也可以是其他的类,也会被整个锁住,排队进入。
- 任意实例的对象Object,即实例对象Object。
- 方法:
- synchrinized具有
重入性
。每个对象拥有一个计数器,当线程获得该对象的锁后,计数器加一,释放锁后就会将计数器减一。
volatile
- Java虚拟机提供的
最轻量级的同步机制
。 - 两种特性
可见性
:指一条线程修改了这个变量的值,新值对于其他线程来说可以立即得知
。即每次变量值都存主内存获取,不从工作内存,每次变更都刷新到主内存,- 可见性的存在条件
运算结果不依赖变量的当前值
,或者能够保证只有单一的线程修改变量值。- 变量不需要与其他的状态变量共同参与不变约束。
- 可见性的存在条件
禁止指令重排序优化
- 指令重排序优化:是指变量在方法的执行过程中所有
依赖赋值结果的地方
都能获取到正确的结果,而不能保证变量赋值操作的顺序和程序中的执行顺序
是一致的。该操作属于机器级的优化操作
。
- 指令重排序优化:是指变量在方法的执行过程中所有
- 性能
读操作
:volatile变量的性能消耗与普通变量几乎没有什么差别。写操作
:会慢一些,因为需要在本地代码中插入许多内存屏障指令
来保证处理器补发生乱序行为。
final
修饰类
:表明一个累不能被继承,final类中的成员变量被隐式的指定为final方法。修饰方法
:方法被锁定,不能被继承该类的子类修改。修饰变量
:- 如果修饰基本数据类型的变量,则其数值一旦初始化之后便不能修改。
- 如果修饰引用类型的变量,则对其初始化之后便不能指向另一个对象(内存地址不能变化,但对象的
内部属性可以变
)。
synchronized部分参考地址:https://www.jianshu.com/p/d53bf830fa09