Java显式锁——相对于synchronized

1.Lock接口和核心方法

  • 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老师笔记

你可能感兴趣的:(Java显式锁——相对于synchronized)