以下截图及相关信息,均来源于马士兵公开课中
锁销除 lock eliminate
public void add(String str,String str2){
StringBuffer sb = new StringBuffer();
sb.append(str).append(str2);
}
StringBuffer 是线程安全的,因为它的关键方法都是被 synchronized 修饰过的,但是发现上面的代码,sb 这个引用只会在 add 方法中使用,不可能被其他线程引用 (因为是局部变量,栈私有),因此 sb 是不可能共享的资源,JVM 会消除 StringBuff 对象内部的锁。
锁粗化 lock coarsening
public void test() {
int i = 0;
//在锁粗化之前运行逻辑如下列代码
while(i < 100) {
synchronized (this) {
}
i++;
}
//在锁粗化之后运行逻辑如下列代码
synchronized (this) {
while(i < 100) {
i++;
}
}
}
JVM 会检测到这样一连串的操作都对同一个对象加锁(while 循环内 100 次执行 append ,没有锁粗化的就要进行 100 次加锁/解锁 ),此时 JVM 就会将加锁的范围粗化到这一连串的操作的外部(比如 while 循环体外),使得这一连串操作只需要加一次锁即可。
锁降级(不重要)
https://www.zhihu.com/question/63859501
其实,只被VMThread访问,降级也就没啥意义了。所以可以简单认为锁降级不存在!