微信公众号:BoomDev
如有问题或建议请留言
最近更新:2018-06-07
Synchronized 和 ReentrantLock 有什么区别
经典回答:
Synchronized
是 java 内建的同步机制、它提供的互斥的语义和可见性、当一个线程获取当前锁时、其他线程只能等待或阻塞在哪里、它可以修饰方法也可以修饰特定的代码块
ReentrantLock
再入锁、语义和 Synchronized
基本相同、再入锁是通过调用 lock 方法获取、它能实现 Synchronized
无法做到的细节控制、比如 fairness(公平性)、值得注意的是、必须调用 unlock 释放锁、不然会一直持有该锁
扩展分析
- 理解什么是线程安全
- Synchronized 和 ReentrantLock 的基本使用
- synchronized 和 ReentrantLock 底层实现、理解锁膨胀、降级、理解偏斜锁、自旋锁、轻量级锁、重量级锁
- 并发包中
java.util.concurrent.lock
的不同实现
知识扩展
线性安全:是指在多线程环境下数据正确性的概念、保证多线程环境下共享的、可修改的数据正确性
换个角度来说、如果状态不是共享的或可修改的、也就不存在线程安全问题:
- 封装:将数据状态内部隐藏、保护起来
- 不可变:final 修饰符
线程安全基本特征:
- 原子性:中途操作不会被其他线程干扰、一般采用同步机制
- 可见性:当一个线程修改了某个共享变量、状态能够立即被其他线程知晓、也就是将线程本地状态映射到主内存上、volatile 就是负责保证可见性的
- 有序性:保证线性内串行语义、避免指令重排
我是一名有备而来的 Android 工程师
微信公众号:BoomDev
欢迎关注我、一起学习、一起进步!