JAVA锁

作者: 小犇手K线研究员 | 来源:发表于2017-03-14 13:17 被阅读33次

    概述

    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提供读锁和写锁,读锁是共享锁,读锁和读锁共存,写锁是排斥锁。

    相关文章

      网友评论

          本文标题:JAVA锁

          本文链接:https://www.haomeiwen.com/subject/lcwcnttx.html