美文网首页
多线程6:synchronized 锁定类方法及volatile

多线程6:synchronized 锁定类方法及volatile

作者: 不怕天黑_0819 | 来源:发表于2020-06-22 14:29 被阅读0次

    同步静态方法

    • synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁。即静态同步方法和非静态同步方法持有的是不同的锁,前者是类锁,后者是对象锁。
    • 所谓类锁,举个再具体的例子。假如一个类中有一个静态同步方法A,new出了两个类的实例B和实例C,线程D持有实例B,线程E持有实例C,只要线程D调用了A方法,那么线程E调用A方法必须等待线程D执行完A方法,尽管两个线程持有的是不同的对象。

    volatile 关键字

    这就Java内存模型JMM,Java中有一块主内存,不同的线程有自己的工作内存,同一个变量值在主内存中有一份,如果线程用到了这个变量的话,自己的工作内存中有一份一模一样的拷贝。每次进入线程从主内存中拿到变量值,每次执行完线程将变量从工作内存同步回主内存中。
    被volatile修饰的变量,保证了每次读取到的都是最新的那个值。线程安全围绕的是可见性和原子性这两个特性展开的,volatile解决的是变量在多个线程之间的可见性,但是无法保证原子性。关于volatile无法保证原子性可以参考这篇文章。volatile为什么无法保证原子性

    synchronized除了保障了原子性外,其实也保障了可见性。因为synchronized无论是同步的方法还是同步的代码块,都会先把主内存的数据拷贝到工作内存中,同步代码块结束,会把工作内存中的数据更新到主内存中,这样主内存中的数据一定是最新的。

    参考链接:https://www.cnblogs.com/xrq730/p/4853578.html

    相关文章

      网友评论

          本文标题:多线程6:synchronized 锁定类方法及volatile

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