在接收完基本概念后,我们看看显示锁(Lock)和内部锁(synchronized)有什么不同。
- Lock 支持更细粒度的同步控制
- Lock是无阻塞锁,synchronized 是阻塞锁。当线程A持有锁S,如果线程B也期望获取锁S,如果是显示锁则线程B进入等待状态,如果是内部锁则线程B进入阻塞状态
- Lock可以实现公平锁,synchronized 只能是非公平锁 公平是指JVM优先选择等待时间最长的线程持有锁,非公平是指随机选择
- Lock 是代码级的,synchronized 是JVM级的
java 的内存模型,在java 中每个线程都有自己的工作内存,如寄存器,高速缓存等,线程在写入的时候首先写入的是自己的工作内存中,然后在刷到主内存中,读取也是先从主内存加载到工作内存中,然后线程是从工作内存中获取。
volatile 只能保证每次读写数据的时候都是对主内存进行操作,但是并不能保证该资源的同步。