Java多线程同步(锁)的实现方法(synchronised 与reentrantlock)

1. synchronized关键字

  • synchronized可以在任意对象上加锁,而加锁的这段代码将成为互斥区或临界区

  • 每个对象都可以做为锁,但一个对象做为锁时,应该被多个线程共享,这样显得有意义

  • sleep()和CPU调度都不会放锁,而wait()会放锁

  • 在什么对象上加锁 ?

    • 代码块 : 指定的对象
    • 方法上 : this引用
    • 静态方法上 : class对象
  • 另外:Collections类里有一组synchronized方法可以将Collection封装成同步的

2. java.util.concurrent.locks.lock类

  • 临界区边界灵活了

  • 锁释放的顺序由用户决定

  • 可以有多个Condition

ReentrantLock

  • 重入锁指的是在某一个线程中可以多次获得同一把锁,在线程中多次操作有锁的方法

  • 需要使用除了内置锁以外的锁特性,比如可中断,可等待的锁,平等锁等

  • 可轮询,可中断,定时,非块,公平队列等高级特性时候使用可重入锁

Synchronized与Lock之间的区别?

Synchronized Lock
使用Object本身的notify、wait、notify调度机制 可以使用condition进行线程间的调度
必须显示声明加载在方法上或者指定代码块中 需要显示声明指定的起始位置与终止位置
托管给JVM执行,不会因为异常、没有释放而发生死锁 手动释放锁(最好再finally中释放)

synchronized与ReentrantLock之间区别

  • JDK5中增加了一个Lock接口的实现类ReentrantLock
  • 多了锁投票、定时锁、等候和中断锁。竞争不是很激烈时,Synchronized的性能优于ReentrantLock,在竞争特别激烈时,syn的性能会下降的非常快