Java多线程⑥----Lock知识点梳理

多线程文章目录

激烈竞争lock比synchonized更佳

lock、condition、ReadWriteLock 三个接口

Lock

可以看到lock更加灵活;注意需要在finally方法释放锁

下面对上述的5个方法进行一句话总结:
lock():获取锁,不可中断、不可超时。
lockInterruptibly():获取锁,可以中断、不可超时。
trylock():获取当前可用的锁并返回true,否则返回false,无需中断、无需超时。
tryLock(long time, TimeUnit unit):获取限定时间可用的锁并返回true,否则返回false,可以中断、可以超时。
unlock():解锁。

Condition

Condition可以替代传统的线程间通信,用await()替代wait,用signal替代notify(),用signalAll()替代notifyAll()。
因为Object下面的wait/notify/notifyAll方法都是final的,所以名称上全都发生了改变。传统线程通信方式,condition都能实现。
condition()是被绑定到Lock上面的,要创建一个Lock的conditon,需要用newCondition
ArrayBlockingQueue 使用condition实现

因为有时候获得锁的线程发现其某个条件不满足导致不能继续后面的业务逻辑,此时该线程只能先释放锁,等待条件满足。

参考代码是网上找的

public class LockDemo {
    final Lock lock = new ReentrantLock();
    final Condition notFull  = lock.newCondition();
    final Condition notEmpty = lock.newCondition();

    final Object[] items = new Object[100];
    int putptr, takeptr, count;

    public void put(Object x) throws InterruptedException {
        lock.lock();
        try {
            while (count == items.length)
                notFull.await();
            items[putptr] = x;
            if (++putptr == items.length) putptr = 0;
            ++count;
            notEmpty.signalAll();
        } finally {
            lock.unlock();
        }
    }

    public Object take() throws InterruptedException {
        lock.lock();
        try {
            while (count == 0)
                notEmpty.await();
            Object x = items[takeptr];
            if (++takeptr == items.length) takeptr = 0;
            --count;
            notFull.signalAll();
            return x;
        } finally {
            lock.unlock();
        }
    }
}

应用:

ReentrantLock 可重入锁,(公平锁加参数,ArrayBlockingQueue开启公平锁)

ReadWriterLock 读写锁 支持并发读 只要没有线程进行写操作,多个线程可以同时持有这个只读锁

https://blog.csdn.net/hanchao5272/article/details/79683202 可重入锁介绍

lock和 synchonized应用简单比较

https://blog.csdn.net/hanchao5272/article/details/79679919

原理:

Lock实现过程中的几个关键词:计数值、双向链表、CAS+自旋、代码LockSupport.park

https://juejin.im/entry/5b9f0571f265da0a8f35b4bb

Linux 下的 POSIX thread 是轻量级的 Mutex.

底层Posix的 加锁pthread_mutex_lock()、解锁pthread_mutex_unlock()和

尝试加锁 pthread_mutex_trylock() 、互斥量 ---信号量

Lock的底层实现也是Posix lock mutex,但是通过 CAS和 ASQ(AbstractQueuedSynchronizer)队列;

来使得这个过程更高效和灵活.

LockSupport.park 是什么

https://blog.csdn.net/hengyunabc/article/details/28126139

https://www.jianshu.com/p/f32f941335aa

浅谈mutex

http://dreamrunner.org/blog/2014/06/29/qian-tan-mutex-lock/

猜你喜欢

转载自blog.csdn.net/Zzhou1990/article/details/106170619