Java 锁与分布式锁

  • 线程间使用JVM锁

    • volatile 具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正确性”
    • synchronized (同步锁)
    • ReentrantLock (重入锁)
    • ReadWriteLock (读写锁)
    • StampedLock (戳锁)
  • 进程间,多节点使用分布式锁

jvm锁比较:

  • 可见性:volatile ,synchronized ,ReentrantLock
  • 原子性:synchronized ,ReentrantLock
  • 有序性:ReentrantLock
  • 效率:volatile > synchronized > ReentrantLock

多节点使用分布式锁比较

  • 分布式锁性能 redis > zookeeper > mysql
  • 可靠性 zookeeper > redis > mysql

注意: 加锁和释放锁要成对,如果加锁而没有释放锁那么会发生死锁!

Java volatile

Java volatile 请看这里

Java synchronized

Java synchronized 请看这里

Java ReentrantLock

Java ReentrantLock 请看这里

Java ReadWriteLock

Java ReadWriteLock 请看这里

Java StampedLock

Java StampedLock 请看这里

Java Lock 简介

Java Lock 在这个 java.util.concurrent.locks 包里

Lock 相关Api

int getHoldCount()
查询当前线程保持此锁的次数。
protected Thread getOwner()
返回目前拥有此锁的线程,如果此锁不被任何线程拥有,则返回 null。
protected Collection Thread getQueuedThreads()
返回一个 collection,它包含可能正等待获取此锁的线程。
int getQueueLength()
返回正等待获取此锁的线程估计数。
protected Collection Thread getWaitingThreads(Condition condition)
返回一个 collection,它包含可能正在等待与此锁相关给定条件的那些线程。
int getWaitQueueLength(Condition condition)
返回等待与此锁相关的给定条件的线程估计数。
boolean hasQueuedThread(Thread thread)
查询给定线程是否正在等待获取此锁。
boolean hasQueuedThreads()
查询是否有些线程正在等待获取此锁。
boolean hasWaiters(Condition condition)
查询是否有些线程正在等待与此锁有关的给定条件。
boolean isFair()
如果此锁的公平设置为 true,则返回 true。
boolean isHeldByCurrentThread()
查询当前线程是否保持此锁。
boolean isLocked()
查询此锁是否由任意线程保持。
void lock()
获取锁。
void lockInterruptibly()
如果当前线程未被中断,则获取锁。
Condition newCondition()
返回用来与此 Lock 实例一起使用的 Condition 实例。
String toString()
返回标识此锁及其锁定状态的字符串。
boolean tryLock()
仅在调用时锁未被另一个线程保持的情况下,才获取该锁。
boolean tryLock(long timeout, TimeUnit unit)
如果锁在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁。
void unlock()
试图释放此锁。