有些业务场景中,某段代码需要线程获取多把锁,才能完成业务逻辑 。
但由于代码的bug,或者释放锁的顺序不正确,可能会引起死锁的问题 。
例如:
"pool-4-thread-1" prio=10 tid=0x00007f27bc11a000 nid=0x2ae9 waiting on condition [0x00007f2768ef9000]JAVA.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for<0x0000000090e1d048> (a java.util.concurrent.locks.ReentrantLock$FairSync)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
比如线程a拥有锁c,需要获取锁d,才能完成业务逻辑 。
而刚好此时线程b拥有锁d,需要获取锁c,也能完成业务逻辑 。
线程a等待线程b释放锁,而线程b等待线程a释放锁,两个线程都持有对方需要的锁,无法主动释放,就会出现死锁问题 。
死锁会导致CPU使用率飙升 。
7、正则匹配不知道你使用过正则表达式没有?
有时候我们为了验证用户输入的手机号、邮箱、身份证号、网页地址是否合法 。
通常情况下,会使用正则表达式,例如:
^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~/])+$
这个正则表达式可以分为三个部分:
- 第一部分匹配 http 和 https 协议 。
- 第二部分匹配 www. 字符 。
- 第三部分匹配许多字符 。
其实这里导致 CPU 使用率高的关键原因就是:Java 正则表达式使用的引擎实现是NFA自动机,这种正则表达式引擎在进行字符匹配时会发生回溯 。
而一旦发生回溯,那其消耗的时间就会变得很长,有可能是几分钟,也有可能是几个小时,时间长短取决于回溯的次数和复杂度 。
我们写的正则表达式,要尽量减少回溯 。
8、耗时计算【完了,CPU100%了,教你如何快速定位CPU100%问题】有时候,我们的业务系统需要实时计算数据,比如:电商系统中需要实时计算优惠后的最终价格 。
或者需要在代码中,从一堆数据中,统计汇总出我们所需要的数据 。
如果这个实时计算或者实时统计的场景,是一个非常耗时的操作,并且该场景的请求并发量还不小 。
就可能会导致cpu飙高 。
因为实时计算需要消耗cpu资源,如果一直计算,就会一直消耗cpu资源 。
推荐阅读
- 爆火的AI热,催生了这些新职业
- Spring Boot启动了几个IoC容器?如何证明?
- 从公司50亿参数AI绘画模型简单了解宅男AI小姐姐的生成模型
- 京东快递H5项目接入vite实战
- 宋慧乔的花期好长,她做对了什么?
- 2023年进口游戏版号来了!腾讯、网易、B站在列
- 850万年薪求贤?这一行业火了,专业人才太少,多家公司百万高薪挖人…
- 买大虾,选“直虾”还是“弯虾”?老渔民:区别很大,别再买错了
- 野菜图鉴来了!品味春天不迷路
- 张新成|张新成,什么都演只会害了你!