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

posted on 2021-03-10 17:24  蓝色阿根廷  阅读(295)  评论(0编辑  收藏  举报