Java核心技术36讲-进阶部分

ReetrantLock vs synchronized

线程安全需要保证几个基本特征

  • 原子性,相关操作不会中途被其他线程干扰,一般通过同步机制实现
  • 可见性,一个线程修改了某个共享变量,其状态能立即被其他线程知晓
  • 有序性,是保证线程内串行语义,避免指定重拍

synchronized使用 monitorenter/monitorexit

ReetrantLock

  • 支持公平性,会品倾向于把锁赋给等待时间最久的线程,synchronized是不公平的
  • 一般情况下公平性没有那么重要,Java默认调度策略很少会导致饥饿,除非确实有公平性需要才要指定
  • 带超时的获取锁尝试
  • 可以判断是否有线程,或者某个特定线程,在排队等待获取锁
  • 可以响应中断请求
  • ReentrantLock还包括了条件变量(java.util.concurrent.Condition)
  • 不要将获取锁的过程写在try块内,因为如果在获取锁时发生了异常,异常抛出的同时,也会导致锁无故被释放
     

猜你喜欢

转载自blog.csdn.net/hixiaoxiaoniao/article/details/87877113
今日推荐