java多线程高并发—(二)
锁消除 lock eliminate
public void add(String str1,String star2){
StringBuffer sb = new StringBuffer();
sb.append(str1).append(str2);
}
我们都知道StringBuffer是线程安全的,因为她的关键字方法都是synchronized修饰过的,但是我们看上这段代码,sb这个引用只会在add方法中使用,不可能被其他线程引用(因为是局部变量,栈私有),因此sb是不可以共享的资源,JVM会自动消除StringBuffer对象内部的锁。
锁粗化 lock coarsening
public String test(String str){
int i=0;
StringBuffer sb = new StringBuffer();
while(i<100){
sb.append(str);
i++;
}
return sb.toString();
}
JVM会检测到这样一连串的操作都对同一个对象加锁(while循环内100次执行append,没有锁粗化的就要进行100次加锁/解锁),此时JVM就会将加锁的范围粗化到这一串的操作外部(比如while虚幻体外),使这一连串操作只需要加一次锁即可。
synchonized实现过程
- Java代码:synchronized
- monitorenter monitorexit
- 执行的过程中锁升级
- lock comxchg (cpu汇编级别)