首页 > 其他分享 >volatile和synchronized关键字

volatile和synchronized关键字

时间:2023-01-30 11:12:01浏览次数:67  
标签:变量 synchronized 关键字 线程 内存 recursions volatile

1.volatile关键字

 Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。

当一个变量定义为 volatile 之后,将具备两种特性:

  1.保证此变量对所有的线程的可见性,这里的“可见性”,如本文开头所述,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存(详见:Java内存模型)来完成。

  2.禁止指令重排序优化。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。

注意:

volatile关键字不能保证原子性(在使用volatile修饰的字段时会检查其是否失效,如果在计算完成,写入时阻塞,唤醒之后不会再次判断volatile修饰的字段是否有效,而是直接写入)

2.synchronized关键字

synchronized关键字可以保证原子性,即只有一个线程可以进入到被synchronized修饰的逻辑中

2.1锁升级

 

2.2 synchronized与Monitor

每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向 Monitor 对象的指针

monitor对象重要属性说明:

_owner:指向持有ObjectMonitor对象的线程

_WaitSet:存放处于wait状态的线程队列

_EntryList:存放处于等待锁block状态的线程队列

_recursions:锁的重入次数

_count:用来记录该线程获取锁的次数

假如当前线程A、B、C同时访问同步块。

假如A获取到锁,也就会将 monitor 对象中的 _owner 的值赋值为当前线程ID。B、C线程会进入EntryList中。count =1 , recursions=1。假如A线程第二次进入同步快,count = 2, recursions=2,当前线程退出时,count和recursions会减一,直到count=0, recursions=0时,说明线程A释放了monitor锁,然后会唤醒EntryList中的线程,EntryList线程会竞争monitor,竞争到了,和线程A的操作一致。

 

 

标签:变量,synchronized,关键字,线程,内存,recursions,volatile
From: https://www.cnblogs.com/isalo/p/17055023.html

相关文章

  • 注释 标识符和关键字 java
    单行注释// 多行注释/*......*/ 文件注释/**......*/ 关键字  标识符●所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线()开始●首字符......
  • 春哥博客 - this关键字
    this关键字1、代表当前这个类2、调用另一个全参的构造函数publicStudent(Stringname,intage,chargender){//给当前这个类的对象每个属性依......
  • 春哥博客 - New关键字
    1、创建对象2、隐藏从父类那里继承过来的同名成员,隐藏的后果就是子类调用不到父类的成员了。子类名称和父类名称写的一样的时候,你就调用不到父类的成员了,如果你故意这么......
  • Javafinal关键字
    final关键字的使用要求final关键字final在java中表示的意思是最终的意思。也可以称为完结器。可以使用final关键字声明类、属性、方法。使用final声明的类不能有子类......
  • Java中this关键字的作用
    this关键字的作用 1.表示类中的属性2.可以使用this调用本类的构造方法3.this表示当前对象 1.1this调用本类中的属性classPerson{privateStringname;//姓......
  • vue3和百度地图关键字检索 定位 点击定位
    效果图在index.html中引入百度地图开放平台  去申请你的ak非常的简单可以自己百度一下<!--这个用官网给的有好多警告更具百度的把https://api.map.baidu.com......
  • java多线程基础小白指南--synchronized同步块
    sychronized是java多线程非常关键的一个知识点,这篇博客将从synchronized几个用法以及代码来学习。sychronized的作用是能够保证同一时间只有一个线程来运行这块代码,达到并......
  • 浅谈synchronized关键字的理解
    简介:synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。synchronized属于独占......
  • vscode 利用正则 搜索标签 tags (?=.*关键字1)(?=.*关键字2).*
    vscode利用正则搜索标签(?=.关键字1)(?=.关键字2).*这里关键词是可以多个并且不按照顺序搜索的,就是写起来需要(?=.关键字)最后.结尾我是不是需要制作一个转换的小......
  • java多线程基础小白指南--关键字识别(start,run,sleep,wait,join,yield)
    在学习java多线程基础上,会遇到几个关键字,理解并识别它们是掌握多线程的必备知识,下面,我将通过源码或者程序演示给出我对这几个关键字的理解,如果有不同意见,欢迎在评论区或者......