Android 基础技术——Synchonized 关键字

 笔者希望做一个系列,整理 Android 基础技术,本章是关于Synchonized 关键字

Synchronized 关键字的作用是什么?

原子性:确保线程互斥访问同步代码

可见性:保证共享变量的修改能够及时可见,就是通过 Java 内存模型中 “对一个变量unlock 操作之前,必须同步到主内存中;对一个变量进行lock操作,则会清空工作内存中此变量的值;在执行引擎使用此变量之前,需要从主内存中load操作或者assign操作初始化变量值”来保证的。

有序性:有效解决重排序问题,即:一个unlock 操作先行发生于后面对同一个变量的lock操作

原理是什么?

Java 虚拟机中的同步是基于进入和退出管程Monitor 对象实现的,无论是显式同步(有明确的monitorenter 和 monitorexit 指令 即同步代码块)还是隐式同步都是如此

同步代码块的原理是什么

被synchronized 修饰的代码,在被编译器编译后被修饰的代码前后加上一组字节指令。在代码的开始加入了 monitorenter,在代码后面加入了 monitorexit,这两个字节码指令配合完成了 synchronized关键字修复代码的互斥访问。在虚拟机器执行到monitorenter指令的时候,会请求获取对象的monitor 锁,基于monitor 锁又衍生出一个锁计数器的概念。当执行 monitorenter时,若对象未被锁定,或者当前线程已经拥有了此对象的monitor 锁,则锁计数器+1,该线程获取该对象锁。当执行monitorexit 时,锁计数器-1,当计数器为0 时,此对象锁就被释放了。那么其他阻塞的线程则可以获取该monitor 锁

同步方法的原理是什么

使用方法级的synchonized 是隐式同步,无需通过字节码指令来控制,它的实现在方法调用和返回操作之中。

JVM 可以从方法常量池中的方法表结构(method_ifno Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。当方法调用时候,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有 monitor (虚拟机规范中用的管程),然后执行方法,最后在方法完成(无论是正常完成还是非正常完成)时释放 monitor

synchronized 锁优化是什么
  • 偏向锁,是指一段同步代码一直被一个线程访问,那么这个线程会自动获取锁,降低获取锁的代价。
  • 轻量级锁,是指当锁是偏向锁时,被另一个线程所访问,偏向锁会升级为轻量级锁,这个线程会通过自旋的方式尝试获取锁,不会阻塞,提高性能。
  • 重量级锁,是指当锁是轻量级锁时,当自旋的线程自旋了一定的次数后,还没有获取到锁,就会进入阻塞状态,该锁升级为重量级锁,重量级锁会使其他线程阻塞,性能降低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM(2)实战篇

1 内存调优 1.1 内存溢出和内存泄漏 内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。 内存泄漏绝…

5G LAN

5G LAN定义 5G LAN 是企业专用蜂窝网络解决方案。5G LAN 集成到组织现有的 IT 基础设施中以提供 5G 的所有优势,以确定的性能和延迟为整个企业的关键任务数字计划创建高速可预测的无线连接。根据定义,5G LAN 消除了在企业自己的环境中采用私有 5G 无线技…

单调队列和优先队列

本篇记录下一下关于单调队列和优先队列(堆)的方法以及解题思路. 文章目录 一. 单调队列1. 绝对差不超过限制得最长连续子数组2. 跳跃游戏 VI3. 设计自助结算系统4. 和至少为k的最短子数组5. 满足不等式的最大值 二. 优先队列1. 最后一块石头的重量2. 数据…

SQL实现模糊查询的四种方法总结

目录 一、一般模糊查询 二、利用通配符查询 1. _ 表示任意的单个字符 2. % 表示匹配任意多个任意字符 3. [ ]表示筛选范围 4. 查询包含通配符的字符串 一、一般模糊查询 1. 单条件查询 //查询所有姓名包含“张”的记录select * from student where name like 张 2. 多条…

十二:枚举与注解

文章目录 01、枚举类的使用1.1、枚举类的理解1.2、自定义枚举类1.3、使用enum关键字定义枚举类1.4、Enum类中的常用方法1.5、使用enum关键字定义的枚举类实现接口 02、注解的使用2.1、注解的理解2.3、如何自定义注解2.4、jdk中4个基本的元注解的使用12.5、jdk中4个基本的元注解…

uniapp 适配鸿蒙next调研

1.官方的一些回答 DCloud有资源第一时间得到鸿蒙无apk手机的上市计划。我们和华为保持着紧密沟通,会把握好节奏,不用担心。大家可以观察一个信号,等微信的鸿蒙next版敲定了,鸿蒙无apk手机就可以明确上市计划了。鸿蒙的开发语言是a…

算法竞赛STL:bitset使用方法

STL-bitset使用方法 文章目录 STL-bitset使用方法 容器描述: bitset是一种特殊的数组,它的每一个元素只能是0或1。每个元素只占用1bit空间,所以它是一种空间效率极高的数据结构。bitset在处理大量的位级数据时非常有用。 使用方法&#xff1…

数据结构:动态内存分配+内存分区+宏+结构体

一、作业 1.定义一个学生结构体&#xff0c;包含结构体成员&#xff1a;身高&#xff0c;姓名&#xff0c;成绩&#xff1b;定义一个结构体数组有7个成员&#xff0c;要求终端输入结构体成员的值&#xff0c;根据学生成绩&#xff0c;进行冒泡排序。 #include <stdio.h>…

UE蓝图 Cast节点和源码

系列文章目录 UE蓝图 Cast节点和源码 文章目录 系列文章目录Cast节点功能一、Cast节点用法二、Cast节点使用场景三、Cast节点实现步骤四、Cast节点源码 Cast节点功能 在Unreal Engine&#xff08;UE&#xff09;中&#xff0c;Cast节点是一种蓝图系统中的节点&#xff0c;用于…

【性能测试入门必看】性能测试理论知识

一、性能测试理论知识 1、常用的七种性能测试方法 (1) 后端性能测试&#xff1a;其实&#xff0c;你平时听到的性能测试&#xff0c;大多数情况下指的是后端性能测试&#xff0c;也就是服务器端性能测试。后端性能测试&#xff0c;是通过性能测试工具模拟大量的并发用户请求&…

linux系统Grafana关联zabbix显示

Grafana关联zabbix 服务器下载浏览器配置开启zabbix插件配置zabbix数据源可视化Zabbix数据 服务器下载 grafana-cli plugins list-remote grafana-cli plugins list-remote|grep -i zabbix grafana-cli plugins install alexanderzobnin-zabbix-appsystemctl restart grafana-…

HBase 进阶

参考来源: B站尚硅谷HBase2.x 目录 Master 架构RegionServer 架构写流程MemStore Flush读流程HFile 结构读流程合并读取数据优化 StoreFile CompactionRegion Split预分区&#xff08;自定义分区&#xff09;系统拆分 Master 架构 Master详细架构 1&#xff09;Meta 表格介…

抵御数据攻击:有效应对.360勒索病毒的方法

导言&#xff1a; 在数字时代&#xff0c;恶意软件已经成为网络安全的一大挑战&#xff0c;而.360勒索病毒则是其中一种具有破坏性的恶意软件。本文91数据恢复将介绍.360勒索病毒的特点、恢复被其加密的数据文件的方法以及预防措施&#xff0c;以帮助读者更好地了解和对抗这种…

Mysql查询统计最近12个月,每个月的数量,并且显示每个月份,如果月份没有数据量需要以“0”填充

文章目录 第一种&#xff1a;第二种&#xff1a;第三种&#xff1a;第四种&#xff1a;MySQL 5.8以下 是不支持 WITH RECURSIVE 的 第一种&#xff1a; 可以使用MySQL的日期和时间函数来生成包含最近12个月的日期&#xff0c;并且使用LEFT JOIN 和 GROUP BY 语句来统计每个月的…

Vue | (一)Vue核心(上) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;Vue简介&#x1f4da;初识Vue&#x1f4da;模板语法&#x1f4da;数据绑定&#x1f4da;MVVM模型&#x1f4da;数据代理&#x1f407;回顾Object.defineproperty方法&#x1f407;何为数据代理&#x1f407;Vue中的数据代理 &#x1f4da;事件处理&#…

游戏分组/王者荣耀

题目描述 部门准备举办一场王者荣耀表演赛&#xff0c;有 10 名游戏爱好者参与&#xff0c;分 5 为两队&#xff0c;每队 5 人。 每位参与者都有一个评分&#xff0c;代表着他的游戏水平。 为了表演赛尽可能精彩&#xff0c;我们需要把 10 名参赛者分为实力尽量相近的两队。一…

C语言 判断当前存储大小端问题

1.代码1 #include<stdio.h>int check_sys(){int a1;return *(char*)&a;//将int*强制转换为char* 判断一个字节的内容就知道当前存储模式 } int main(){if(1check_sys())printf("小端");elseprintf("大端");return 0; }2.代码2 使用联合体判断大…

优先队列的用法

介绍 英文名-priority_queue队首元素为当前优先级最高的 访问 只能通过top()函数来访问队首元素 #include <iostream> #include <queue>//调用queue头文件 using namespace std; int main(){priority_queue<int> pq1;//定义&#xff1a;默认数字越大优先…

基于java的眼镜店仓库管理系统

源码获取&#xff0c;加V&#xff1a;qq2056908377 摘要&#xff1a; 随着电子商务的兴起&#xff0c;越来越多的商家选择在线销售他们的产品。眼镜店作为零售业的一种&#xff0c;也不例外。随着市场需求的不断增加&#xff0c;眼镜店需要更加高效的管理他们的仓库和库存&…

Mysql 权限与安全管理

0 引言 MySQL是一个多用户数据库&#xff0c;具有功能强大的访问控制系统&#xff0c;可以为不同用户指定允许的权限。MySQL用户可以分为普通用户和root用户。root用户是超级管理员&#xff0c;拥有所有权限&#xff0c;包括创建用户、删除用户和修改用户的密码等管理权限&…