java高并发学习-死锁(一)
死锁发生的必要条件:
1、互斥条件
2、请求和保持条件
3、资源不剥夺条件
4、环路等待条件
多线程的最佳并发实践;
1、 使用本地变量
2、使用不可变类
3、最小化锁的作用域范围 : S = 1/(1-a+a/n) (阿木达尔定律)
其中,a为串行计算部分所占比例,n为并行处理结点个数。这样,当a=0时,最大加速比s=n;当a=1时,最小加速比s=1;当n→∞时,极限加速比s→ 1/a,这也就是加速比的上限。例如,若串行代码占整个代码的25%,则并行处理的总体性能不可能超过4。这一公式已被学术界所接受,并被称做“阿姆达尔定律”(Amdahl law)。
4、使用线程池的Executor,而不是使用new Thread();
5、宁可使用同步也不要使用wait()和notify()
6、使用blockingQueue实现生产者消费者模式
7、使用并发结合而不是加了锁的同步集合
8、使用semaphore创建有界的访问
9、宁可使用同步代码块,也不要使用同步的方法
10、避免使用静态变量
hashmap和concurrenthashmap
hashmap 最终要的两个参数是加载容量和扩容因子。
当当前使用内存超过加载容量和扩容因子的乘积的时候,就会对hashmap进行扩容,在扩容的过程中并不是线程安全的,在并发调用的时候,可能出现死循环。
concurrenthashmap1.7版本和1.8版本的区别是1.8引入了红黑树,当链表数量超过8的时候,就会触发红黑树,红黑树的寻址时间是o(logn),而链表的寻址时间是o(n)
缓存学习:
命中率 = 命中数/(命中数+未命中数)
最大元素空间:
缓存清空策略: FIFO、LFU、LRU、过期时间、随机等
业务场景和业务需求: 缓存适合读多写少的应用场景
Guava cache : 继承了concurrenthashmap 的设计思路
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!