美文网首页
Synchronized锁的其他信息

Synchronized锁的其他信息

作者: CodeYang | 来源:发表于2022-10-26 07:01 被阅读0次

    以下截图及相关信息,均来源于马士兵公开课中


    锁销除 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访问,降级也就没啥意义了。所以可以简单认为锁降级不存在!

    相关文章

      网友评论

          本文标题:Synchronized锁的其他信息

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