Java并发编程一般都会用到锁,采用了阻塞形式的并发,而有时加锁后执行效率也应尽可能地得到最大提升。提供其性能,少消耗或者浪费些资源。
一、尽量减少锁持有时间
在开发同步机制代码中进行加锁操作,应该尽量避免把锁的加在不需要同步加锁的代码块上,这样可以减少所持有的时间。
二、控制减少锁粒度
意思是加锁的范围尽量缩小,能控制在一个对象上就不要加在方法或者方法块中。将锁定的对象拆成更小粒度的小对象,就可以增加程序的并行度,降低多线程间锁的竞争,使加锁的成功率得到提高,因而达到锁优化的目的。
三、读写锁分离
如果系统业务上对读取数据和写入数据的之间的量差太大的话,应当尝试读写锁分离。Lock接口就是这种实现类,将读与写进行分离,读线程后进行程序业务代码实现,节省了部分时间,而它不会改变数据,所以读与读之间不需要进行同步,当线程写入数据的时候,再来进行同步阻塞。这样就可以很好的提高系统的性能。
四、锁粗化
通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽可能短,但是某些特殊情况下,一个程序对同一个锁不间断、高频地请求、同步与释放,会消耗掉一定的系统资源,因为锁的讲求、同步与释放本身会带来性能损耗,这样高频的锁请求就反而不利于系统性能的优化了,虽然单次同步操作的时间可能很短,但相同的操作过于频繁会影响性能,有些情况下我们反而希望把很多次锁的请求合并成一个请求,以降低短时间内大量锁请求、同步、释放带来的性能损耗。
锁粗化就是 JVM 检测到一串零碎的操作都对同一个对象加锁,则会把加锁同步的范围粗化到整个操作序列的外部。例如StringBuffer使用时内部的 StringBuffer.append() 每次都会加锁,将会锁粗化的话,在第一次 append() 前至 最后一个 append() 后只需要加一次锁就可以了。
网友评论