静态字段属于类,非静态字段属于类的实例
类 | 实例 | |
---|---|---|
类级别的锁 | 可以保护 | 不可保护 |
实例级别的锁 | 不可保护 | 可以保护 |
我们知道静态字段属于类,类级别的锁才能保护;而非静态字段属于类实例,实例级别的锁就可以保护。
加锁要考虑锁的粒度和场景问题
- 在大多数的三层架构中,数据都是通过Controller、Service、Repository 流转到数据库,没必要使用 synchronized 来保护什么数据
- 使用锁,可能会极大地降低性能。使用 Spring 框架时,默认情况下 Controller、Service、Repository 是单例的,加上 synchronized 会导致整个程序几乎就只能支持单线程,造成极大的性能问题。
分析:
即使我们确实有一些共享资源需要保护,也要尽可能降低锁的粒度,仅对必要的代码块甚至是需要保护的资源本身加锁。
StampedLock 共享资源冲突概率不大(JDK1.8及以上)
ReentrantReadWriteLock适合读写差异大的场景
公平锁在强度不大的场景下,对性能损耗很大