无锁编程
- CAS:先比较后设置,容易产生ABA问题,多线程下自旋浪费资源。
jdk中提供原子操作类·AtomicBoolean AtomicInteger AtomicLong
jdk1.8 优化:LongAdder 在CAS的基础上额外增加了分段锁 - volatile:共享内存变量,强制刷新变量变更到内存。
- threadlocal:线程享有数据副本,单独操作。会占用大量内存。
有锁编程
- 缩小使用范围
对于synchronized关键字来说,缩小锁的影响范围,在业务允许下代码块优于方法,对于非必要加锁的代码尽量排除。但是对于大量循环来说需要粗化锁减少获取锁的次数。 - 缩小粒度
对于synchronized关键字来说,对象锁的使用粒度可以根据业务细分,不同的业务竞争不同对象锁。如:增加/更新操作可以是两个对象锁。 - 分段锁
jdk中广泛使用,如ConcurrentHashMap 分段锁,jdk1.8后的CAS优化 - 读写分离
对于读多写少的业务可以采用读写分离。如jdk提供的ReentrantReadWriteLock 读为共享锁,写为独占锁。
除了分段处理有其他的优化方式么?有木有大牛分享一下。