Java中的一些不常见的关键字

2023-09-22 13:43:55

transient

对于transient 修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略。 因此,transient变量不会贯穿对象的序列化和反序列化,生命周期仅存于调用者的内存中而不会写到磁盘里进行持久化。

Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输。

在持久化对象时,对于一些特殊的数据成员(如用户的密码,银行卡号等 涉及安全性的数据),我们不想用序列化机制来保存它。为了在一个特定对象的一个成员变量上关闭序列化,可以在这个成员变量前加上关键字transient。

static修饰的静态变量天然就是不可序列化的。

transient关键字只能修饰变量,而不能修饰方法和类。(本地变量是不能被transient关键字修饰的。)
变量如果是用户自定义类变量,则该类需要实现Serializable接口。

volatile

volatile同样用于修饰类属性,不能用于修饰本地变量
volatile可以理解为一种轻量级的同步机制(区别于锁机制),能够减少线程上下文的切换和调度,但volatile的同步性也没有锁的强,对于一些非原子性的操作还是不能做到完全保证同步。

先来看看volatile的实现原理吧:
Java的内存模型
在这里插入图片描述
所有线程的共享变量都存储在主内存中,每一个线程都有一个独有的工作内存,每个线程不直接操作在主内存中的变量,而是将主内存上变量的副本放进自己的工作内存中,只操作工作内存中的数据。当修改完毕后,再把修改后的结果放回到主内存中。每个线程都只操作自己工作内存中的变量,无法直接访问对方工作内存中的变量,线程间变量值的传递需要通过主内存来完成。
如果对变量加上volatile关键字后,如果某线程A修改了该变量后,会立即将变量的值刷到主内存中,其他线程中的变量失效,必须从主内存中重新获取。

底层原理:
volatile可见性是通过汇编加上Lock前缀指令,触发底层的MESI缓存一致性协议来实现的。

状态描述
M 修改 (Modified)此时缓存行中的数据与主内存中的数据不一致,数据值存在于本工作内存中,其他线程从主内存中读取共享变量值的操作会被延迟执行,直到该缓存行数据将数据写回到主内存后
E 独享 (Exclusive)此时缓存行中的数据会与主内存中的数据一致,数据只存在本工作内存中。此时会监听其他线程读主内存中共享变量的操作,如果发生,该缓存行需要变成共享状态
S 共享 (Shared)此时缓存行中的数据与主内存中的数据一致,数据存在于很多工作内存中。此时会监听其他线程使该缓存行无效的请求,如果发生,该缓存行需要变成无效状态。
I 无效 (Invalid)此时该缓存行无效

简单翻译一下:获取volatile的所有线程都会监听内存总线中该变量的获取状态。如果一个线程正在对某volatile修饰的变量修改时,其他线程中的值会变为无效状态,等待修改完成,再重新去主内存中获取新的值。

在这种模式下会出现一些并发问题,例如:a++这种自增的操作,但并非原子性的情况

时间操作
1线程A获取到a
2线程B获取到a
3线程A:a++
4线程B:由于线程A的修改,导致线程B的值失效,不执行操作

因此,想完全实现同步,还需要引入锁机制

参考:CSDN博主「天瑕」的原创文章


而volatile另一个特性则是禁止指令重排序,底层原理则是在指令间通过内存屏障实现。

instanceof

判断一个对象是否是一个类的实例,返回值为true/false
ObjectName instanceof ClassName

更多推荐

直线模组的常用语

在工业生产中,直线模组的叫法有很多种,对于新手小白来说,很容易就会被绕晕,今天我们就来简单说一下直线模组的常用称呼吧!1、直线模组:与直线滑台同义,基本可以相互互换。直线模组一般是指可以完成直线运动和直线定位的传动模块,一般不包括电机驱动和运动控制系统在内,常用的直线模组分为滚珠丝杆型直线模组和同步带传动型直线模组。2

Windows 修改系统默认字体

WindowsRegistryEditorVersion5.00;重装机后电脑屏幕及字体调整.reg.lnk;;显示器分辨率:3840*2160;;自定义缩放:266;;辅助功能-文本大小-110%;;最后ClearType文本调谐器;https://www.cnblogs.com/bolang100/p/854804

数据结构 - 链表

线性表的链式存储结构概念将线性表L=(a0,a1,…,an-1)中各元素分布在存储器的不同存储块,成为结点,通过地址或指针建立元素之间的联系。结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai+1所在的结点。下图中的首元结点(头结点)A的data不重要,next域指向链表的真正的第一个结点

js同级弹窗实现数据传输修改

window.postMessage是一种用于实现跨窗口通信的HTML5特性。它允许在不同窗口或iframe之间安全地传递数据,即使这些窗口来自不同的域名。window.postMessage方法接受两个参数:message:要发送的消息,可以是一个字符串或一个对象。targetOrigin:指定接收消息的窗口的源(o

C语言每日一题(7):获得月份天数

文章主题:获得月份天数🔥所属专栏:C语言每日一题📗作者简介:每天不定时更新C语言的小白一枚,记录分享自己每天的所思所想😄🎶个人主页:[₽]的个人主页🏄🌊目录前言编程起因项目介绍设计思路1.整体逻辑2.具体逻辑代码展示效果展现结语前言编程起因最近在牛客网上刷到了一个很好的训练分支语句的题目,于是想出了求两个数

NeRF-RPN:一个通用的目标检测框架

论文标题:NeRF-RPN:AgeneralframeworkforobjectdetectioninNeRFs代码:https://github.com/lyclyc52/NeRF_RPN图1:在NeRF上的Regionproposal结果视频演示效果:https://www.youtube.com/watch?v=

进程与线程

1进程1.1进程的概念进程就是正在运行的程序,它代表了程序所占用的内存区域1.2进程的特点独立性进程是系统中独立存在的实体,它可以拥有自己独立的资源,每个进程都拥有自己私有的地址空间在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间动态性进程与程序的区别在于.程序只是一个静态的指令集合,而进程

spring security为啥是个垃圾框架?

古时候写代码,权限这块写过一个库,基本就是一个泛型接口,里面有几个方法:如验证输入的principal和credentials,返回token和authorities和roles,role就是一堆authorities集,也就说就是返回一堆authorities。然后每次请求会拿token找到authorities,然

C语言之指针进阶篇(3)

目录思维导图回调函数案例1—计算器案例2—qsort函数关于qsort函数NO1.NO2.NO3.NO4.演示qsort函数的使用案例3—冒泡排序整型数据冒泡排序回调函数搞定各类型冒泡排序cmp_int比较大小cmp传参数NO1.NO2.解决方案交换swap总代码今天我们学习指针难点之回调函数🆗🆗🆗。首先我们用思

springcloud3 分布式事务实现逻辑思想2

一分布式事务逻辑1.1CAP理论CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partitiontolerance(分区容错性)这3个基本需求,最多只能同时满足其中的2个。总结:1.2CAP的应用场景假如现在有这样的场景:用户访问了N1,修改了

【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题

前言💓作者简介:加油,旭杏,目前大二,正在学习C++,数据结构等👀💓作者主页:加油,旭杏的主页👀⏩本文收录在:再识C进阶的专栏👀🚚代码仓库:旭日东升1👀🌹欢迎大家点赞👍收藏⭐加关注哦!💖学习目标:在上一篇博客中,我们学习了回调函数,以及怎么使用qsort函数去排序;那么在这一篇博客中,我们来更加详细

热文推荐