ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

synchronized 关键字和 volatile 关键字

2021-08-13 12:33:51  阅读:133  来源: 互联网

标签:变量 synchronized 关键字 线程 volatile 排序


  • synchronized 关键字

    1. 对于synchronized 关键字的了解

      synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。

    2.synchronized 关键字的使用方式

      我们通常使用synchronized关键字来给一段代码或一个方法上锁。它通常有以下三种形式:
    // 关键字在实例方法上,锁为当前实例
    public synchronized void instanceLock() {
        // code
    }

    // 关键字在静态方法上,锁为当前Class对象
    public static synchronized void classLock() {
        // code
    }

    // 关键字在代码块上,锁为括号里面的对象
    public void blockLock() {
        Object o = new Object();
        synchronized (o) {
            // code
        }
    }

 总结:

1. synchronized 关键字加到 static 静态方法和 synchronized(class) 代码块上都是是给 Class 类上锁。
2. synchronized 关键字加到实例方法上是给对象实例上锁。
3. 尽量不要使用 synchronized(String a) 因为 JVM 中,字符串常量池具有缓存功能!
  • volatile 关键字

    1. volatile 关键字的用法

    • 保证变量的内存可见性
    • 禁止volatile变量与普通变量重排序

    2. 内存可见性

      内存可见性,指的是线程之间的可见性,当一个线程修改了共享变量时,另一个线程可以读取到这个修改后的值。

    3. 重排序

      为优化程序性能,对原有的指令执行顺序进行优化重新排序。重排序可能发生在多个阶段,比如编译重排序、CPU重排序等。

  • synchronized 关键字和 volatile 关键字的区别

      1. volatile 关键字是线程同步的轻量级实现,所以 volatile 性能肯定比synchronized关键字要好 。但是 volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块 。
      2. volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。
      3. volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性。

标签:变量,synchronized,关键字,线程,volatile,排序
来源: https://www.cnblogs.com/zeliCode/p/15136823.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有