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锁粗化和锁消除
发布评论