美文网首页
Java 多线程锁优化

Java 多线程锁优化

作者: 会九卦的兔子 | 来源:发表于2018-08-05 23:54 被阅读0次

    Java并发编程一般都会用到锁,采用了阻塞形式的并发,而有时加锁后执行效率也应尽可能地得到最大提升。提供其性能,少消耗或者浪费些资源。

    一、尽量减少锁持有时间

        在开发同步机制代码中进行加锁操作,应该尽量避免把锁的加在不需要同步加锁的代码块上,这样可以减少所持有的时间。

    二、控制减少锁粒度

        意思是加锁的范围尽量缩小,能控制在一个对象上就不要加在方法或者方法块中。将锁定的对象拆成更小粒度的小对象,就可以增加程序的并行度,降低多线程间锁的竞争,使加锁的成功率得到提高,因而达到锁优化的目的。

    三、读写锁分离 

        如果系统业务上对读取数据和写入数据的之间的量差太大的话,应当尝试读写锁分离。Lock接口就是这种实现类,将读与写进行分离,读线程后进行程序业务代码实现,节省了部分时间,而它不会改变数据,所以读与读之间不需要进行同步,当线程写入数据的时候,再来进行同步阻塞。这样就可以很好的提高系统的性能。

    四、锁粗化

        通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽可能短,但是某些特殊情况下,一个程序对同一个锁不间断、高频地请求、同步与释放,会消耗掉一定的系统资源,因为锁的讲求、同步与释放本身会带来性能损耗,这样高频的锁请求就反而不利于系统性能的优化了,虽然单次同步操作的时间可能很短,但相同的操作过于频繁会影响性能,有些情况下我们反而希望把很多次锁的请求合并成一个请求,以降低短时间内大量锁请求、同步、释放带来的性能损耗。

        锁粗化就是 JVM 检测到一串零碎的操作都对同一个对象加锁,则会把加锁同步的范围粗化到整个操作序列的外部。例如StringBuffer使用时内部的 StringBuffer.append() 每次都会加锁,将会锁粗化的话,在第一次 append() 前至 最后一个 append() 后只需要加一次锁就可以了。

    相关文章

      网友评论

          本文标题:Java 多线程锁优化

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