美文网首页
【java并发编程实战读书总结终章】死锁、活锁、性能问题

【java并发编程实战读书总结终章】死锁、活锁、性能问题

作者: powerjiajun | 来源:发表于2019-02-21 22:29 被阅读0次

活跃性危险

死锁

什么是死锁?

一条小路上两个人堵到了一起,a说你让我先走吧,b说不行我不让,你先让我走,互不相让,两个人都过不去。

A线程等待b线程的锁,b线程的任务在等待a线程的锁,两个线程在此处不停尝试获得锁,永无休止。

1.png

死锁的种类:

静态锁顺序死锁

2.png

如图直接看代码就能看出有死锁问题。

动态锁顺序死锁

代码看起来好好的,只有运行时在某种特定的极端情况下才会出现。

3.png

当fromAccount和toAccount同时相互转账并且都进入了第一层synchronized开始尝试获取第二层synchronized的锁时就会发生死锁。

资源死锁

多个线程加锁访问共同资源。

饥饿死锁:

线程一直等不到需要的资源,比如调接口、访问数据库时一直得不到响应。

防止死锁的方式:

1.显示锁的定时tryLock方法,尝试获取锁超时后就放弃获取锁操作,避免永久尝试。

2.调整程序逻辑,避免死锁。

活锁

一个相同的任务执行一次后不能完成,然后反反复复执行重演历史,始终无法完成。

性能和伸缩性

性能:用尽可能少的资源尽可能短的时间做尽可能多的操作。

伸缩性:吞吐量和处理能力不够用的时候,只要加机器,吞吐量和处理能力就能提高。

多线程会带来哪些开销?

1.上下文切换

2.内存同步

Synchronized和volatile提供的内存可见性会造成一些内存开销,可能会使用到内存栅栏(又称内存屏障memory barrier)指令,常常会刷新cpu的缓存、抑制编译器优化操作(例如防止对这一部分代码重排序、自动去掉一些不必要的锁),主要就是会访问主内存并同步线程的cpu缓存。

4.png

3.阻塞

独占锁是性能和伸缩性主要威胁。

威胁度=锁的请求频率x每次占用锁的时间

威胁度越低,线程对锁的竞争度就越低。

降低锁的竞争度的方法:

1.减少请求锁的频率

2.减少占用锁的时间

被锁保护的代码应尽可能短小,不要执行长时间任务,不需要锁保护的代码统统拿出去,锁的粒度越小越好(能用对象锁就不要用类锁,能用局部代码块就不要用方法锁),快进快出。

3.使用带有协调机制的独占锁

能提供更高的并发。(比如分段锁、读写锁)

非阻塞同步

相关文章

  • 【java并发编程实战读书总结终章】死锁、活锁、性能问题

    活跃性危险 死锁 什么是死锁? 一条小路上两个人堵到了一起,a说你让我先走吧,b说不行我不让,你先让我走,互不相让...

  • 死锁-活锁

    死锁大家都知道,但是 有没有老铁 知道活锁呢?我在看《并发编程实战》的时候 了解到这个名次 活锁 活锁 是指 活锁...

  • Java高并发 -- 并发扩展

    Java高并发 -- 并发扩展 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 死锁 死锁是指...

  • Java线程-死锁(十)

    一、死锁概述 关于死锁,我们可以从哲学家用餐问题说起(该例子来自《Java并发编程实战》)。   话说5个哲学家去...

  • 读书清单

    深入理解Java虚拟机Java并发编程实战高性能mysqlJDK中的类的源码

  • Java并发 - Future模式

    标签:原创 Java 并发 更多Java并发实战内容,请参考Java并发 - 并发编程实战 理解Future 关于...

  • Java Concurrent 死锁

    前言 死锁是一个比较大的概念,在并发场景下的加锁行为都有可能产生死锁问题。在Java 并发编程中会有死锁,操作系统...

  • 4-5 安全性、活跃性以及性能问题

    并发编程中我们需要注意的问题有很多,主要有三个问题:1、安全性问题:可见性,同步机制;2、活跃性问题:死锁,活锁;...

  • Effective java总结

    总结 effecttive java 注意的地方简单概括下。并发部分没有java并发编程实战全。就不写在这了 JD...

  • JAVA死锁

    在JAVA并发编程中,我们使用锁来确保可变共享变量的安全性。要注意的是,不正确的使用锁很容易导致死锁。 死锁的4个...

网友评论

      本文标题:【java并发编程实战读书总结终章】死锁、活锁、性能问题

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