并发编程笔记六:性能问题

六、性能问题

6.1、性能

在一定的配置下,如果一个程序的运行时间越短,吞吐量越大,我们就说这个程序的性能越好。

现代计算机的cpu核数越来越多,cpu执行速度越来越快,多线程的程序可以充分利用多核cpu的性能,提高cpu处理器的利用率。所以,大部分情况下多线程能提高程序的性能。但是如果引入线程的开销和同步代码块对性能的影响大于处理器的利用率,程序的性能是降低的。

6.2、多线程的开销和同步代码块对性能的影响

多线程的开销和同步代码块对性能的影响主要有上下文切换刷新高速缓存阻塞操作

6.2.1、上下文切换

cpu运行线程代码时,会分配给这段线程一段时间片去执行代码。当时间片到达或者遇到阻塞操作或者线程主动放弃时间片,线程都会退出运行状态,这时cpu就需要切换线程的上下文了

上下文切换主要要做以下两件事:

(1)在线程进入cpu执行时,会加载上次执行的上下文信息;在时间片执行完毕时,会保存本次的上下文信息;

(2)线程首次加载到cpu中时,会加载缓存数据到高速缓存中

6.2.2、刷新高速缓存

当我们使用volatile时,会导致cpu高速缓存失效,强制将高速缓存中的数据刷新到主内存中,加载数据也是先从主内存中加载到高速缓存上再使用;

同时使用synchronized或者volatile时,会抑制指令重排序,引起性能损耗。

6.2.3、阻塞操作

当一个线程遇到比如IO的阻塞操作或者获取不到锁而阻塞或者调用sleep等方法而等待,就会影响到整个系统的性能,主要包括:

(1)阻塞或等待的线程会放弃时间片,引起上下文切换;

(2)挂起线程(长时间阻塞)会被临时放入硬盘上;

(3)如果阻塞的线程持有锁,那么其他需要获取这个锁的线程将会无法继续执行。

6.3、性能调优的手段

性能调优的手段主要有减少锁的竞争、减小锁的粒度、减少使用synchronized关键字

(1)减少锁的竞争

减少锁的竞争主要是减少每次持有锁的时间和降低锁的请求频率,所以在同步代码块中的代码尽量不要有比较耗时的操作。

读写锁也是一种减少锁的竞争的方式,当对共享可变变量进行读操作时不会相互阻塞,类似于数据库的S锁和X锁。

(2)减小锁的粒度

对于多个共享可变变量,如果他们之间不存在可变性条件的话,那么不应该使用一把锁来同步这些变量,每个变量都有自己的锁,这样就不会出现相互阻塞了。减小的锁的粒度。

分段锁就是减小锁的粒度的一种方式,concurrentHashMap中就是利用了分段锁来提高性能的。

(3)尽量减少使用synchronized关键字

能使用volatile的地方尽量不要使用synchronized关键字。

(4)使用CAS非阻塞操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值