概述
多线程文章目录
激烈竞争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/
最后
以上就是外向砖头为你收集整理的Java多线程⑥----Lock知识点梳理的全部内容,希望文章能够帮你解决Java多线程⑥----Lock知识点梳理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复