Java锁粗化和锁消除

编程入门 行业动态 更新时间:2024-10-24 18:26:49

<a href=https://www.elefans.com/category/jswz/34/1770091.html style=Java锁粗化和锁消除"/>

Java锁粗化和锁消除

锁粗化

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

————————
1.

    @Testpublic void test1(){StringBuffer sb = new StringBuffer();sb.append("1");sb.append("2");sb.append("3");}
    @Overridepublic synchronized StringBuffer append(String str) {toStringCache = null;super.append(str);return this;}

实际上有3把锁。为了提高效率使用了锁粗化,3把变1把

————————
2.

public void doSomethingMethod(){synchronized(lock){//do some thing}//这是还有一些代码,做其它不需要同步的工作,但能很快执行完毕synchronized(lock){//do other thing}
}

实际上是两把锁,但是锁的是同一个门。所以jvm会优化

public void doSomethingMethod(){//进行锁粗化:整合成一次锁请求、同步、释放synchronized(lock){ //do some thing //做其它不需要同步但能很快执行完的工作//do other thing}
}

————————
3.

for(int i=0;i<size;i++){synchronized(lock){}
}

这里是size把锁,但是锁的是同一个东西,jvm会优化为

synchronized(lock){for(int i=0;i<size;i++){}
}

锁消除

锁消除是发生在编译器级别的一种锁优化方式。
有时候我们写的代码完全不需要加锁,却执行了加锁操作。

    @Testpublic void test4(){synchronized (new Object()){System.out.println("1");}}

这里有一把锁,但是其实这把锁没有什么实际用处,所以jvm会优化。锁消除

更多推荐

Java锁粗化和锁消除

本文发布于:2023-07-28 19:19:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1285492.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Java   锁粗化

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!