Java显式锁——相对于synchronized

1.Lock接口和核心方法

  • 【Java显式锁——相对于synchronized】Lock接口和synchronized的比较
    synchronized :代码简洁
    Lock:获取锁可以被中断,超时获取锁,尝试获取锁,读多写少用读写锁
  • 可重入锁ReentrantLock(递归)
    使用锁的范式
public class LockDemo {private Lock lock= new ReentrantLock(); private int count; //使用显式锁Lock public void increament() { lock.lock(); try { count++; }finally { lock.unlock(); } }//对比synchronized内置锁 public synchronized void incr2() { count++; } }

  • 所谓锁的公平和非公平
    如果在时间上,先对锁进行获取的请求,一定先被满足,这个锁就是公平的,不满足,就是非公平的
    非公平的效率一般来讲更高
  • 问题:为什么非公平锁更高效?(后面的线程可以插队直接来获取锁,而不是唤醒阻塞的线程来获取锁)
2.读写锁
  • ReadWriteLock接口和读写锁ReentrantReadWriteLock
  • 问题:读写锁是怎样实现的?
  • ReentrantLock和Syn关键字,都是排他锁
    读写锁:同一时刻允许多个读线程同时访问,但是写线程访问的时候,所有的读和写都被阻塞,最适宜与读多写少的情况
    读写商品信息示例(读/写比例为10)
    使用读写锁 UseRwLock.java
    对比 使用synchronized UseSyn.java
3.Condition接口
  • 用Lock和Condition实现等待通知(一个锁可以有多个condition)
    快递通知 使用Condition
  • 问题:读写锁是怎样实现的?
  • 问题:一个锁可以有多个condition,相较于一个锁对应一个condition,对性能是否有影响?
  • 问题:对比wait/notifyAll
    wait尽量使用notifyAll,Condition尽量使用signal。
    快递通知 使用wait/notifyAll
参考
  • 1)享学课堂Mark老师笔记

    推荐阅读