• 有关volatile关键字和transient关键字


    (1)volatile关键字['vɑlətl]的作用

    让变量每次在使用的时候,都从主存中取,而不是从各个线程的“工作内存”。
    
    也就是说,volatile变量对于每次使用,线程都能得到当前volatile变量的最新值.

    (2)volatile与synchronized区别

    volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正确性”,也就是说不保证线程执行的有序性。
    
    也就是说,volatile变量对于每次使用,线程都能得到当前volatile变量的最新值。但是volatile变量并不保证并发的正确性。
    
    1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住
    2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
    3.volatile仅能实现变量的修改可见性,并能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
    4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。 
    5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

     (3)什么是线程的working memory

    线程的working memory是cpu的寄存器和高速缓存的抽象描述:现在的计算机,cpu在计算的时候,并不总是从内存读取数据,它的数据读取顺序优先级 是:寄存器-高速缓存-内存。
    线程耗费的是CPU,线程计算的时候,原始的数据来自内存,在计算过程中,有些数据可能被频繁读取,这些数据被存储在寄存器和高速缓存中,当线程计算完后,这些缓存的数据在适当的时候应该写回内存。当多个线程同时读写某个内存数据时,就会产生多线程并发问题,涉及到三个特 性:原子性,有序性,可见性。 支持多线程的平台都会面临 这种问题,运行在多线程平台上支持多线程的语言应该提供解决该问题的方案。 简而言之:每个线程都有自己的执行空间(即工作内存),线程执行的时候用到某变量,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作:读取,修改,赋值等,这些均在工作内存完成,操作完成后再将变量写回主内存;

    (4)产生线程安全的原因 

    由上可知,各个线程都从主内存中获取数据,线程之间数据是不可见的;打个比方:主内存变量A原始值为1,线程1从主内存取出变量A,修改A的值为2,在线程1未将变量A写回主内存的时候,线程2拿到变量A的值仍然为1;这便引出“可见性”的概念:当一个共享变量在多个线程的工作内存中都有副本时,如果一个线程修改了这个共享变量的副本值,那么其他线程应该能够看到这
    个被修改后的值,这就是多线程的可见性问题。

     transient:用来表示一个域不是该对象串行化的一部分,当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中

  • 相关阅读:
    TensorFlow分布式在Amazon AWS上运行
    在C++中加载TorchScript模型
    java 在 linux 持续运行 并不让其输出日志
    reactor.core.Exceptions$OverflowException: Could not emit tick 1 due to lack of requests (interval doesn't support small downstream requests that replenish slower than the ticks)
    https://gitee.com/createmaker/webflux-r2dbc-demo-pri
    清晨与暮霭 : 清晨,我睁开惺忪得眼睛,望向初升的朝阳,感受温暖. 暮霭,聆听风的私语,感受万籁俱寂.
    https://gitee.com/createmaker/eventbus-demo
    Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
    只是习惯,改掉就好,只是不习惯,习惯了就好
    从游戏角度了解RxJava
  • 原文地址:https://www.cnblogs.com/qqzy168/p/3658735.html
Copyright © 2020-2023  润新知