美文网首页
synchronized的底层实现

synchronized的底层实现

作者: zzj0990 | 来源:发表于2020-12-30 17:12 被阅读0次
    1. synchronized是可重入的

    2. JDK早期的 重量级 - OS
      后来的改进
      锁升级的概念:
      我就是厕所所长 (一 二)

    3. sync (Object)
      markword 记录这个线程ID (偏向锁)
      如果线程争用:升级为 自旋锁
      10次以后,升级为重量级锁 - OS

    4. 场景选择
      执行时间短(加锁代码),线程数少,用自旋
      执行时间长,线程数多,用系统锁

    5. volatile并不能保证多个线程共同修改变量时所带来的不一致问题,也就是说volatile不能替代synchronized
      运行下面的程序,并分析结果

    public class T04_VolatileNotSync {
        volatile int count = 0;
    
        // synchronized void m() { // 加上synchronized,问题解决
        void m() {
            for (int i = 0; i < 10000; i++) count++;
        }
    
        public static void main(String[] args) {
            T04_VolatileNotSync t = new T04_VolatileNotSync();
    
            List<Thread> threads = new ArrayList<Thread>();
    
            for (int i = 0; i < 10; i++) {
                threads.add(new Thread(t::m, "thread-" + i));
            }
    
            threads.forEach((o) -> o.start());
    
            threads.forEach((o) -> {
                try {
                    o.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            System.out.println(t.count);
        }
    }
    

    相关文章

      网友评论

          本文标题:synchronized的底层实现

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