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.锁粗化。将一连串的对同一锁请求和释放的操作合并,减少对锁的请求次数;



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值