Java基础总结二

2023-05-16

Java关键字(特点及关键字作用):

(1)被Java语言赋予特殊含义的单词(53个含两个保留字)

(2)关键字都是小写

(3)goto和const作为保留字存在,目前并不使用

(4)关键字在高级的程序开发软件中会识别关键字和 非关键字,关键字会出现特定的颜色,那么在这里需要注意的是:下图中的main不是关键字!

public static void main(String [] args){}
访问修饰符关键字
 本类中同一个包下不同包下的子类不同包下的其他类
privateYes(可访问)   
默认Yes(可访问)Yes(可访问)  
protectedYes(可访问)Yes(可访问)Yes(可访问) 
publicYes(可访问)Yes(可访问)Yes(可访问)Yes(可访问)

 

 

 

 

 

 

数字类型的关键字
byte字节型8bit
char字符型

16bit

boolean布尔型 
short短整型16bit
int整型32bit
float浮点型32bit
long长整型64bit
double双精度64bit
true 
false

 

null 

 

 

 

 

 

 

 

 

 

 

 

 

其他常见关键字
instanceofA instanceof Binstanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
static静态属性和方法都可以用static修饰,类名.属性。类名.方法。只有内部类可以使用static关键字修饰,调用直接使用类名.内部类名进行调用。static 可以独立存在。静态块。
final最终的、不可被改变的方法、类、变量都可以用final来修饰,final修饰的类是不能被继承的,final修饰的方法是不能被子类重写的。final修饰的变量称为常量。
super父类存储空间的标识可以理解为父类的引用,通过这个关键字可以访问父类的成员。super.成员变量。super.成员方法
this当前类的对象引用

this.成员变量。this.成员方法。

native本地一个Native Method就是一个java调用非java代码的接口。当我们对代码的效率有要求时,除了优化本身的Java代码,可能会在程序中使用C、或者C++实现该方法。
strictfp精确浮点strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。
synchronized同步后面的Java总结多线程中记录
transient短暂的[ˈtrænziənt]一个对象只要实现了Serilizable接口,这个对象就可以被序列化。但是开发中有些部分不需要被序列化,此时将transien添加到不需要序列化的属性前面,这个属性就不会被序列化。在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。
volatile易变的保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。禁止进行指令重排序。具体参考https://www.cnblogs.com/dolphin0520/p/3920373.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

下面记录一下自己通过对volatile的了解学习到的相关知识点:

(1)计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。

i=i+1;

当线程执行这个语句时,会先从主存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行指令对i进行加1操作,然后将数据写入高速缓存,最后将高速缓存中i最新的值刷新到主存当中。 

对于单线程来讲,上述代码是没有任何问题的,但是对于多线程来讲,就有可能会产生多个线程对同一个i值进行加1操作,最后就只是这个i值加了1,并没有编程每个线程都给i值加了1.。这个时候就出现了缓存一致性问题。为了解决这个问题。就有两种方式:分别是通过在总线加LOCK锁的方式和通过缓存一致性原则。所谓在总线加锁就是阻塞了其他的CPU对内存等部件的访问,即可以理解为多核CPU变成了单核CPU,极大的降低了效率。而对于缓存一致性原则,最出名的就是Intel 的MESI协议,MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

(2)并发编程的三个概念

原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

有序性:即程序执行的顺序按照代码的先后顺序执行。

JVM在真正执行这段代码的时候会保证写在前面的语句一定会在后面的语句前执行吗?不一定,为什么呢?这里可能会发生指令重排序(Instruction Reorder)。指令重排序,一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。对于指令重排序需要注意的是:处理器在进行重排序时是会考虑指令之间的数据依赖性,如果一个指令Instruction 2必须用到Instruction 1的结果,那么处理器会保证Instruction 1会在Instruction 2之前执行。指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。

也就是说,要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。

(3)Java内存模型为我们提供了哪些保证以及在java中提供了哪些方法和机制来让我们在进行多线程编程时能够保证程序执行的正确性。

原子性:在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。

x = 10;        //语句1
y = x;         //语句2
x++;           //语句3
x = x + 1;     //语句4

上述代码中只有语句1是原子性操作,其他三个语句都不是原子性操作。语句1是直接将数值10赋值给x,也就是说线程执行这个语句的会直接将数值10写入到工作内存中。语句2实际上包含2个操作,它先要去读取x的值,再将x的值写入工作内存,虽然读取x的值以及 将x的值写入工作内存 这2个操作都是原子性操作,但是合起来就不是原子性操作了。同样的,x++和 x = x+1包括3个操作:读取x的值,进行加1操作,写入新的值。

可见性:对于可见性,Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

有序性:在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。在Java里面,可以通过volatile关键字来保证一定的“有序性”。另外可以通过synchronized和Lock来保证有序性,很显然,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然就保证了有序性。另外,Java内存模型具备一些先天的“有序性”,即不需要通过任何手段就能够得到保证的有序性,这个通常也称为 happens-before 原则。如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就不能保证它们的有序性,虚拟机可以随意地对它们进行重排序。


注:以上文章仅是个人学习过程总结,若有不当之处,望不吝赐教。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础总结二 的相关文章

  • PreparedStatement与Statement的区别及优势

    PreparedStatement是用来执行SQL查询语句的API之一 xff0c Java提供了 Statement PreparedStatement 和 CallableStatement三种方式来执行查询语句 xff0c 其中 St
  • Mac Idea卡顿、慢解决方案 限制jvm也没有用【超实用】

    前置 Mac使用idea卡顿 不流畅解决方案 xff0c 设置了jvm也没有用 快捷键提示超级慢的问题 导致原因 下载的软件版本问题 去下载标注的版本就变得非常的流畅 xff0c 超级快 版本说明 xff1a 第一个是英特尔芯片的软件 第二
  • HDFS 启动与关闭

    一 HDFS 启动与关闭 HDFS 和普通的硬盘上的文件系统不一样 xff0c 是通过Java 虚拟机运行在整个集群当中的 xff0c 所以当Hadoop 程序写好之后 xff0c 需要启动HDFS 文件系统 xff0c 才能运行 HDFS
  • Android快速入门之通过Fragment实现底部菜单栏

    早期Android应用通常使用TabHost实现页面之间的切换 xff0c 现在更多的选择ViewPager与Fragment结合的方式实现页面切换 Android提供了专门的适配器 FragmentPagerAdapter和Fragmen
  • Zemax操作35--双高斯镜头优化

    要求 xff1a 双高斯镜头是传统的单反相机镜头 相对孔径 xff1a 1 3 焦距 xff1a 75mm 可见光 视场由一个圆定义 xff0c 圆的直径是胶片的对角线 xff0c 像高21 6mm 畸变小于1 玻璃的边界条件最小边缘 中心
  • C/C++编程题之删除字符串中出现次数最少的字符

    在牛客上刷到删除字符串中出现次数最少的字符 xff0c 现在将通过的代码贴一下 xff0c 供大家参考 实现删除字符串中出现次数最少的字符 xff0c 若多个字符出现次数一样 xff0c 则都删除 输出删除这些单词后的字符串 xff0c 字
  • springboot解决servlet-api-2.5.jar和tomcat-embed-core-9.0.46.jar冲突

    2022 11 04 18 07 52 869 ERROR 86604 restartedMain o s b d LoggingFailureAnalysisReporter APPLICATION FAILED TO START Des
  • PS 修改图片大小

    平常的网络世界中 xff0c 会有一些高清晰的图片出现 xff0c 哦不 xff0c 现在的图片越来越超清了 xff1b 那么 xff0c 就需要对它们大小进行修改 xff0c 不然内存伤不起啊 xff01 以下是三种常用的方法 1 修改图
  • 将若依(RuoYI)项目打包(jar)部署到Linux服务器(详细步骤)

    第一步下载maven方便将RuoYi项目打包 1 下载网址 xff1a http maven apache org download cgi 2 3 下载3 6 3版本 解压完成后 将文件夹名称修改为maven 第二步配置maven环境变量
  • 最通俗易懂的乐观锁与悲观锁原理及实现

    一 乐观锁 总是认为不会产生并发问题 xff0c 每次去取数据的时候总认为不会有其他线程对数据进行修改 xff0c 因此不会上锁 xff0c 但是在更新时会判断其他线程在这之前有没有对数据进行修改 xff0c 一般会使用版本号机制或CAS操
  • 3.12生产者消费者模型(pthread_cond_t、sem_t)

    生产者消费者模型 生产者不能在容器满了继续生产 消费者不能在容器为空的时候消费 生产者消费者模型 粗略的版本 include lt stdio h gt include lt pthread h gt include lt stdlib h
  • ActiveMQ中Topic模式队列和Queue模式队列区别

    Topic和Queue是ActiveMQ两种消息模式 Topic用于消息订阅 xff0c 属于一对多 xff1b Queue用于消息处理 xff0c 属于一对一 分别从工作模式 有无状态 传递完整性 处理效率四个方面比较 工作模式 xff1
  • Java SpringBoot 公众号集成模板推送消息

    前言 上篇 付项目地址 xff1a https blog csdn net A yonga article details 129398716 spm 61 1001 2014 3001 5501 集成公众号请看之前的文章 本篇说明 基于已
  • Android中native进程内存泄露的调试技巧(一)

    基于Android5 0版本 Android为Java程序提供了方便的内存泄露信息和工具 xff08 如MAT xff09 xff0c 便于查找 但是 xff0c 对于纯粹C C 43 43 编写的natvie进程 xff0c 却不那么容易
  • onNewIntent 什么时候调用

    protected void onNewIntent Intent intent Since API Level 1 This is called for activities that set launchMode to 34 singl
  • [MySQL] MySQL日志系统

    概述 Mysql的日志系统是Mysql保证无论何时崩溃数据都不会丢失的关键 众所周知Mysql是持久化的数据库 所有的数据都是持久化到硬盘中的 保证数据不会丢失 Mysql保证数据不会丢失是从以下两个方面来体现的 能够恢复到任意时刻的数据状
  • IDEA搭建JavaWeb项目,JDBC和Servlet-JSP技术实现注册功能

    文章目录 使用IDEA搭建JavaWeb项目一 IDEA新建JavaWeb项目1 新建java项目2 修改项目配置3 项目部署到Tomcat 二 使用JDBC和Servlet JSP技术实现注册功能1 引入jar包2 搭建项目结构3 后端实
  • JS实现省市区三级联动

    目标 xff1a 用JS实现省市区的三级联动效果 学习内容 xff1a 掌握JS对DOM元素的获取掌握 JS对DOM元素的创建和删除掌握JSON数组的简单解析 实现思路 xff1a 省市区三级联动主要是三个下拉菜单之间的联动效果 xff0c
  • MVC三层架构详解

    文章目录 MVC三层架构详解一 MVC是什么 xff1f 1 什么是低耦合 xff1f 2 低耦合有什么好处 xff1f 3 增加代码复用率4 部署快 xff0c 且生命周期成本低5 可维护性高 二 MVC详解1 MVC经典模式2 MVC设
  • Spring-MVC入门

    文章目录 前言一 Spring MVC是什么 xff1f MVC xff1a MVC的工作流程 xff1a 优势 xff1a 二 使用步骤1 创建Maven项目导入依赖 2 配置前端控制器DispatcherServlet 3 配置后端控制

随机推荐

  • 使用阿里云OSS实现图片上传案例

    文章目录 前言一 OSS是什么 xff1f 二 使用步骤1 开通OSS服务2 创建bucket3 创建子账户4 查看帮助文档 xff0c 编写后端代码5 layui前端 总结 前言 在正式的开发环境中 xff0c 类似图片的静态资源一般不会
  • 使用EasyExcel实现Excel的导入导出

    文章目录 前言一 EasyExcel是什么 xff1f 二 使用步骤1 导入依赖2 编写文件上传配置3 配置表头对应实体类4 监听器编写5 控制层6 前端代码 总结 前言 在真实的开发者场景中 xff0c 经常会使用excel作为数据的载体
  • 使用linux部署项目步骤

    文章目录 前言一 服务器环境配置二 数据库导入三 项目打包1 修改项目中的访问路径2 修改db properties的数据库访问路径3 打包4 修改配置 xff0c 启动服务 四 测试总结 前言 今天学习了在服务器中部署项目 xff0c 记
  • IntelliJ IDEA 2023.1 最新变化 【附带ChatGPT教程】

    ChatGPT开源公众号 xff1a https gitee com wy521a astar weixin mp最新变化 2023 1主要更新用户体验编辑器JavaScala分析器版本控制系统构建工具运行 调试框架和技术DockerKub
  • SpringBoot整合Quartz以及异步调用

    文章目录 前言一 异步方法调用1 导入依赖2 创建异步执行任务线程池3 创建业务层接口和实现类4 创建业务层接口和实现类 二 测试定时任务1 导入依赖2 编写测试类 xff0c 开启扫描定时任务3 测试 三 实现定时发送邮件案例1 邮箱开启
  • SpringCloud详解07-Nacos配置管理

    系列文章目录 文章目录 系列文章目录前言一 nacos配置管理二 使用步骤1 基本配置2 导入Nacos配置 三 配置实时刷新总结 前言 接上篇 xff0c 本篇记录Nacos的配置管理 所有的代码都是基于前篇的基础上 一 nacos配置管
  • 使用SpringBoot+JWT+MybatisPlus实现简单的登陆状态验证

    文章目录 前言一 JWT是什么 xff1f 二 使用步骤1 创建项目 xff0c 导入依赖 xff0c 配置 引入工具类2 编写LoginController和UserController3 编写跨域拦截器和token验证拦截器4 全局拦截
  • 浅谈分布式锁

    文章目录 前言一 分布式锁 xff1f 二 实现思路1 存储一个唯一的键2 使用setnx3 给键设置唯一值4 因为超时导致的并发执行4 Redission5 代码实现 总结 前言 最近学习了分布式锁 xff0c 本篇来记录一下 一 分布式
  • 初识STM32单片机

    目录 一 单片机基本认知 二 STM系列单片机命名规则 三 标准库与HAL库区别 四 通用输入输出端口GPIO 五 推挽输出与开漏输出 六 复位和时钟控制 xff08 RCC xff09 七 时钟控制 八 中断和事件 九 定时器介绍 一 单
  • ubuntu16.04 安装ctags,以及一些使用方法的介绍

    vim对于新手来说太不友好了 xff0c 今天折腾ctags折腾了一天终于是有所收获 xff0c 现在来大概介绍一下 首先ctags顾名思义 xff0c 就算给各种库和 cpp文件打标签 xff0c 得到的标签文件给后面omni compl
  • Lottie 框架Native Heap内存爆炸问题解决

    Lottie框架Native Heap内存爆炸问题解决 Lottie 是在 Android 和 iOS上 原生渲染 的After Effects xff08 AE xff09 动画 Lottie是 Airbnb 开源 的支持Android
  • Kali 美化

    配置完Kali xff0c 作为一个正常人 xff0c 对于默认的Gnome的界面都会感觉到一丝丝不满意 xff0c 毕竟太丑了嘛 那么 xff0c 我们需要对Kali美化一下 首先是桌面切换 xff0c 如果你不喜欢Gnome xff0c
  • 安装Arch(含输入法配置)

    先创建一个虚拟机 xff0c 这是我的虚拟机配置 xff1a 然后查看虚拟机的配置文件 xff0c 编辑Arch vmx文件 xff0c 最后一行添加 firmware 61 34 efi 34 保存退出 xff0c 启动你的虚拟机 不出意
  • 使用ViewPager + FragmentStatePagerAdapter 切换后页面数据加载空白或者丢失

    开头直接上结论 xff01 xff01 xff01 xff01 xff01 xff01 第一种原因 xff1a onCreateView中没有做view持久化 viewpage切换的时候Fragment的生命周期会重新走一遍 xff0c 从
  • DataGrip 2023.1 最新变化 【附带ChatGPT教程】

    ChatGPT开源公众号 xff1a https gitee com wy521a astar weixin mp在浏览器中打开最新变化 DataGrip 2023 1 最新变化 处理代码 DBE 4469 xff1a 我们修正了 SQL
  • awk练习题(一)

    文件中包含名字 xff0c 电话号码和过去三个月里的捐款 用 分隔 具体内容如下 xff1a Mike Harrington 510 548 1278 250 100 175 Christian Dobbins 408 538 2358 1
  • UML类图-基本图示法

    类图 xff1a 分如下三层 类的名称 xff08 如果是抽象类则斜体显示 xff09 类的特性 xff08 字段或属性 xff1a 注意前面的符号 xff1a 43 表示public xff0c 表示private xff0c 表示pro
  • 《Design Patterns》Proxy.积跬步系列

    Proxy xff1a 代理模式 先代码 共用接口 xff1a span class token keyword package span h span class token punctuation span l span class t
  • 《Design Patterns》FactoryMethod.积跬步系列

    FactoryMethod xff1a 工厂方法模式 先代码 父类或接口类 xff1a span class token keyword package span h span class token punctuation span ld
  • Java基础总结二

    Java关键字 xff08 特点及关键字作用 xff09 xff1a xff08 1 xff09 被Java语言赋予特殊含义的单词 xff08 53个含两个保留字 xff09 xff08 2 xff09 关键字都是小写 xff08 3 xf