java并发编程总结
Java中有哪些锁
- 悲观锁和乐观锁
- 悲观锁和乐观锁只是一种感念
- 悲观锁:认为资源一定会发生多线程冲突,所以每次操作都会上锁。
- 乐观锁:认为资源不会被其他线程所修改,不上锁。使用volatile与CAS机制配合使用,也可以加版本号。
- 这种概念在mysql数据库中也经常使用,乐观锁:mysql添加一列版本号的字段。
- 独享锁和共享锁
- 独享锁和共享锁只是一种感念
- 独享锁:只让本线程持有这把锁
- 共享锁:允许多个线程持有这把锁
- 如ReentrantReadWriteLock,通过实现AQS的不同实现方法来实现想要的效果
- 互斥锁和读写锁
- 是独享锁和共享锁的具体实现
- 读写锁的具体实现是ReadWriteLock
- 可重入锁
- 允许一个线程多次获得一把锁
- 加锁是state + 1,释放锁时state - 1,为0则完全释放锁
- 也是一种不同的实现AQS方式
- 分段锁
- concurrentHashMap,用Segment分段,默认16段,后优化为每个节点一段
- 公平锁和非公平锁
- 公平锁:来了的线程都去阻塞队列排队
- 非公平锁:新来的线程有机会去抢夺锁资源,失败则取排队
- 偏向锁,轻量级锁和重量级锁
- synchronized的底层优化
- 对象头中记录持有线程的id,如果发现是自己线程,就不需要加锁(这是偏向锁)
- 发现不是自己id,自选等待(这是轻量级锁)
- 等待失败,或多人竞争。继续锁升级,需要操作系统的Monitor对象进行控制。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 杨小白の博客!
评论