JAVA锁

概述

JAVA的锁大致可以分为自旋锁和阻塞锁,自旋锁就是拿不到锁就不断循环尝试去拿,阻塞锁是如果拿不到锁线程就阻塞,知道锁被释放,然后去竞争。自旋锁一般需要利用原子操作自己实现,阻塞锁在java种有对象锁synchronized、ReentrantLock、ReentrantReadWriteLock。reentrant是课重入的意思,表示锁的获取是可以递归获取的,在自己实现锁的时候一定要注意此性质。
参考blog: http://ifeve.com/java_lock_see2/ http://blog.csdn.net/niluchen/article/details/8119426

锁的类结构比较简单

java lock (1).png

2017-03-14 13-49-30屏幕截图.png

以下内容来自(http://ifeve.com/lock-reentrantlock/)
void lock();获取锁。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。
void lockInterruptibly() throws InterruptedException;如果当前线程未被中断,则获取锁。如果锁可用,则获取锁,并立即返回。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下两种情况之一以前,该线程将一直处于休眠状态:锁由当前线程获得;或者其他某个线程中断 当前线程,并且支持对锁获取的中断。如果当前线程:在进入此方法时已经设置了该线程的中断状态;或者在获取锁时被中断 ,并且支持对锁获取的中断,则将抛出 InterruptedException ,并清除当前线程的已中断状态。
boolean tryLock();仅在调用时锁为空闲状态才获取该锁。如果锁可用,则获取锁,并立即返回值 true 。如果锁不可用,则此方法将立即返回值 false 。通常对于那些不是必须获取锁的操作可能有用。
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。如果锁可用,则此方法将立即返回值 true 。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下三种情况之一前,该线程将一直处于休眠状态:
void unlock();释放锁。对应于lock()、tryLock()、tryLock(xx)、lockInterruptibly()等操作,如果成功的话应该对应着一个unlock(),这样可以避免死锁或者资源浪费。
newCondition() 返回用来与此 Lock 实例一起使用的 Condition 实例。
ReentrantLock是排斥锁,与synchronized类似,不过执行成本更低。

public interface ReadWriteLock {
    /**
     * Returns the lock used for reading.
     *
     * @return the lock used for reading.
     */
    Lock readLock();

    /**
     * Returns the lock used for writing.
     *
     * @return the lock used for writing.
     */
    Lock writeLock();
}

ReadAndWriteLock提供读锁和写锁,读锁是共享锁,读锁和读锁共存,写锁是排斥锁。

推荐阅读更多精彩内容