zoukankan      html  css  js  c++  java
  • java 线程之-volatile

    前言-发奋忘食,乐以忘优,不知老之将至.

    介绍:在java中用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值[注意:不要被这个都字误导.稍后做详细解释].volatile很容易被[误用],用来进行[原子性]操作。

    解释:在java的虚拟机运行的机制中,java的线程运行程序的时候,为了保证程序运行的效率问题,每个线程运行的时候,虚拟机会单独为这个线程分配一块临时内存区域,我们可以称之为[当前线程专用内存]

    而线程会把自己运行过程中所需要的变量加载到[当前线程专用内存]之中,(举例线程A需要执行一个对变量a的++的操作,在线程加载的时候,会首先把变量a加入到自己的[当前线程专用内存]当中),当线程

    执行完毕的时候,会再把当前的保存在[当前线程专用内存]的变量,更新到[原始内存]当中.

    问题:如果有两个线程AB,同时对变量进行upate操作,那么在两个线程执行当中,可能会出现这样一种情况,两个线程进入程序,都在自己的[当前线程专用内存]当中保存了,变量的原始值.那么两个线程执行

    完毕之后,最后一个执行的线程的update操作将覆盖第一个线程执行的update操作.----------------程序的不同步问题(银行取钱存钱问题.)


    解决思路
        1.同时只让一个程序执行update操作----------效率低-------synchronized
        
        2.执行updtae操作的时候,让线程不要从[当前线程专用内存]中读取备份的变量,而是直接从内存中读取变量--------效率稍高-------volatile


  • 相关阅读:
    如何紧急恢复SQL Server主数据库
    合理利用SQL Server查询执行计划
    理解RAID的四种级别
    sp_spaceused 显示行数、保留的磁盘空间以及当前数据库中的表、索引视图
    修复数据库索引问题:理解填充因数设置
    SQL Server调整因子
    sqlservr 命令行启动
    DBA需要考虑备份相关问题
    BCP
    “tablediff ”命令行工具
  • 原文地址:https://www.cnblogs.com/yatou520/p/4115837.html
Copyright © 2011-2022 走看看