【锁】

1、锁类型

  • jdk1.5之前
    1、内置锁
    2、volatile
  • jdk1.5
    1、ReentrantLock

2、区别

显式锁Lock

  • 无条件的(不需要有一个互斥对象)
  • 可轮询,由tryLock方法实现,可避免死锁,因为会释放锁
  • 定时的,由tryLock方法实现,可避免死锁,因为会释放锁
  • 可中断的,在try-finally加锁模式
  • 内置锁获取锁和释放锁操作都在同一个代码块,而显式锁不用,更灵活
  • 公平性,线程按照请求的先后顺序来获取锁。
    非公平性有一定的优势。A获取锁,B等待锁,A释放锁,B被唤醒途中,C获取锁,C运行,C释放锁,B被唤醒完成,B获取锁。
    这样运行了3个线程。如果是公平的话,只运行两个线程

3、显式锁

private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock r = lock.readLock();
private final Lock w = lock.writeLock();

public V put(K key, V value) {
w.lock();
try {
....
} finally {
  w.unlock();
  }
}

public V get(Object key) {
r.lock();
try {
....
} finally {
  r.unlock();
  }
}

这样避免了"读-写"和“写-写”冲突。读和读是共享的。

你可能感兴趣的:(【锁】)