java多线程解说【拾捌】_锁的总结,多线程
java多线程解说【拾捌】_锁的总结,多线程
java多线程解说【壹】_什么是线程
java多线程解说【贰】_java内存模型
java多线程解说【叁】_Thread的常用API实现
java多线程解说【肆】_锁实现:wait()/notify()
java多线程解说【伍】_锁实现:ReentrantLock的实现
java多线程解说【陆】_锁实现:Condition的实现
java多线程解说【柒】_锁实现:Lock/Condition的例子
java多线程解说【捌】_锁实现:读写锁ReentrantReadWriterLock
java多线程解说【玖】_锁实现:LockSupport工具类
java多线程解说【拾】_12个原子操作类
java多线程解说【拾壹】_并发容器
java多线程解说【拾贰】_并发框架:Fork/Join
java多线程解说【拾叁】_并发框架:Future
java多线程解说【拾肆】_线程池
java多线程解说【拾伍】_并发工具类:CountDownLatch
java多线程解说【拾陆】_并发工具类:CyclicBarrier
java多线程解说【拾柒】_并发工具类:Semaphore
不知不觉已经总结了这么多的关于多线程的文章,从年前到年后,不过感觉还是没有总结完,可能这部分知识也总结不完。慢慢学习,慢慢整理,慢慢总结吧。本文就查缺补漏,看看补充些关于锁的知识点。
同步(Synchronized)和锁有两个特点:
1.只能锁定对象,不能锁定原始类型;
2.被锁定的数组中的单个对象不会锁定(细想想就知道怎么回事了);
其实同步到底是做什么,说白了就是保证在不同线程中,获取到的被锁定对象的内存块都是最新的。因此Synchronized方法后,对被锁定对象的任何操作都会在锁释放之前刷回到主内存中。
可重入锁ReentrantLock和内部锁Synchronized相比,优点有:
1.可以重入,也就是锁一个线程可以连续获取2次锁;
2.提供了tryLock(等待时长,单位)接口,可以在单位时间内尝试获取锁,而不至于一直阻塞;
3.可以在两个方法中;
4.支持公平锁;
说到公平锁,它的公平性是以增加了线程的暂停和唤醒的可能性来实现的,也就是增加了上下文切换为代价。那么什么是上下文切换?
上下文切换就是对线程的上下文信息(CPU状态)进行保存和恢复的过程,使得线程执行能够从中断点恢复执行。
Thread.sleep()
Object.wait()
Thread.join()
Thread.yield()
LockSupport.park()
都可能导致上下文切换。内部锁也有一个好处,就是不会造成锁泄漏。
什么是锁泄漏呢?就是一把锁永远无法释放(可能是忘记了)。除了锁泄漏,并发中锁的使用还有如下陷阱:
1.死锁
线程一直暂停而任务无法执行;
2.锁死
等待线程由于某种原因一直无法唤醒而导致任务无法进行;
3.饥饿
线程一直无法获得资源而任务无法执行;
4.活锁
线程一直做无用功而任务无法进行完成;
因此在高并发的情况下,有何优化锁的思路呢?
1.减少锁的持有时间;
2.减少锁粒度;
3.读写锁替换独占锁;
4.锁分离;
5.锁粗化。将一连串的对同一锁请求和释放的操作合并,减少对锁的请求次数;
相关文章
- 暂无相关文章
用户点评