zoukankan      html  css  js  c++  java
  • volatile/synchronized

    Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。

    volatile 变量

    1. volatile用于修饰简单数据类型变量,如int、float、boolean等。

    2.强制线程直接从内存中读写

    3.当写一个 volatile 变量时,随后对该变量读时会创建一个 happens-before 关系。所有在 volatile 变量写操作之前完成的写操作,将会对随后该 volatile 变量读操作之后的所有语句可见。

    4.避免程序优化过程中调整volatile变量的顺序。永远不会将 volatile 变量前的写语句放在 volatile 变量之后,也不会将 volatile 变量读之后的读操作重排序到 volatile 变量之前。

    5. "volatile 变量"可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。如当变量的值由自身的上一个值决定时,如n=n+1、n++等,volatile关键字将失效

    6. volatile主要是在使用多线程对全局变量(即静态变量)进行操作时来加以控制。所以在使用volatile关键时如果没有把握,可以使用synchronized来代替volatile。

    因为 volatile 变量强制访问主存,而访问主存肯定比访问 CPU 缓存慢。同时,它还防止 JVM 对程序的优化,这也会降低性能。
     

    synchronized

    1. synchronized不能修饰变量 -- 它修饰的是代码块或者是方法。

    2. 修饰方法时需要放在返回类型之前。

    3. synchronized关键字修饰方法时,同步锁为当前实例;修饰静态方法时,同步锁为该类Class。

    synchronized块可以同步一个对象变量、静态方法和非静态方法。语法为:

    括号中的“表达式”实际上为同步锁。

    使用 synchronized 关键字也会在语句之间建立 happens-before 关系。进入一个同步方法或块时,会将之前的语句和该方法或块内部的语句建立 happens-before 关系。

  • 相关阅读:
    .net Ioc 之 Unity 适合刚开始使用
    今天研究Unity Ioc 框架
    C#连接周立功CAN盒,调用ZCAN_OpenDevice函数时返回值一直是0失败。
    CAN通讯
    初学winform 自定义控件
    linq联表查询的时候报错
    dot net core 在IIS发布后,打开网页报错
    网卡驱动正常,网线也正常,但是网线插入电脑网口,网口指示灯就是不亮,网络适配器显示网线拔出
    flutter环境配置(windows)
    C#连接oracle数据库报错:OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用
  • 原文地址:https://www.cnblogs.com/whuqin/p/4982087.html
Copyright © 2011-2022 走看看