zoukankan      html  css  js  c++  java
  • java并发volatile和sychnorized的底层机制

    java代码在编译后会变成java字节码,字节码被类加载器加载到jvm中,jvm执行字节码,最终转换成汇编指令在cpu上执行。java中的并发机制,依赖于jvm的实现和cpu的命令。

    java中定义了voldatile和sychronized来实现线程之间的通信。

    java并发编程中有三大特性

    1.原子性,一个操作或者多个操作,要么全部成功,要不都不成功

    2.可见性,多个线程共同访问共享变量时,一个线程修改了此变量,其他线程立刻能看到修改后的值

    3.有序性,程序执行的顺序按照代码的先后顺序执行。java内存模型允许编译器和处理器为了效率,进行指令重排,多线程并发环境中,要考虑如何指令部分重排的同时又保证有序性。

    sychronized保证了以上三种特性,sychronized在加锁前重新刷新了最新值到工作内存中,解锁前又将共享变量最新值刷新到主内存中,以此保证了可见性。而又因同步块中的数据相当于只在一个单线程中执行,故此不存在原子性和有序性的问题。volatile只保证了可见性和有序性并不保证原子性。

    1. volatie

    轻量级的sychronized,保证了共享变量的可见性,且不会引起上下文的切换和调度。

    volatile如何保证可见性?

    java内存模型,保证每条线程都有自己的工作线程,里面存放着主内存的拷贝副本。线程的读写都是在工作线程中操作,但是volatile变量执行写操作时,会将最新变量刷新到主内存中,并使得其他线程中的缓存无效,需要重新从主内存拿到。以此保证了并发的可见性。

    volatile如何保证有序性?

    volatile通过编译器生成字节码时,通过添加内存屏障来禁止指令从排序。

    2.sychronized

    在升级之前,该锁是重量级锁。升级之后,sychronized锁等级从低到高分别是无锁,偏向锁,轻量级锁,重量级锁。

    参考 https://www.cnblogs.com/suixing123/p/13996479.html

  • 相关阅读:
    Response.Redirect 打开新窗体的两种方法
    linux下coredump的产生及调试方法
    AlertDialog具体解释
    数据仓库与数据挖掘的一些基本概念
    JS中setTimeout()的使用方法具体解释
    iOS开发- 查询项目代码行数
    STM32学习之路-LCD(3)<显示图片>
    谷歌技术"三宝"之MapReduce
    [ffmpeg 扩展第三方库编译系列] 关于libvpx mingw32编译问题
    javascript笔记
  • 原文地址:https://www.cnblogs.com/scru/p/14513033.html
Copyright © 2011-2022 走看看