Java中关键字总结汇总
transient
transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后, transient 变量的值被设为初始值, 如 int
型的是 0,对象型的是 null。
instanceof
instanceof 是 Java 的保留关键字,是 一个二元操作符,类似于 ==,>,<等操作符。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
public static void test(Object o) {if (o instanceof Map)System.out.println("对象是Map的实例");else if (o instanceof ArrayList)System.out.println("对象是ArrayList的实例");elseSystem.out.println("对象是 " + o.getClass() + "实例");
final
final是Java中的一个关键字,它所表示的是“这部分是无法修改的”。使用 final 可以定义 :变量、方法、类。修饰的变量无法进行修改。修饰的类则不能被继承。修饰的方法不能被重写,会报错。
static
可以修饰成员变量和成员方法,也可以修饰静态static代码块。
const
const是Java预留关键字,用法跟final相似。
synchronized
Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized、volatile、final、concurren包等。synchronized可以满足解决遇到的原子性、可见性和有序性问题。synchronized可以修饰静态方法、实例方法、代码块。
方法
方法级的同步是隐式的。同步方法的常量池中会有一个ACC_SYNCHRONIZED标志。当某个线程要访问某个方法的时候,会检查是否有ACC_SYNCHRONIZED,如果有设置,则需要先获得监视器锁,然后开始执行方法,方法执行之后再释放监视器锁。这时如果其他线程来请求执行方法,会因为无法获得监视器锁而被阻断住。值得注意的是,如果在方法执行过程中,发生了异常,并且方法内部并没有处理该异常,那么在异常被抛到方法外面之前监视器锁会被自动释放。
代码块
同步代码块使用monitorenter和monitorexit两个指令实现。可以把执行monitorenter指令理解为加锁,执行monitorexit理解为释放锁。 每个对象维护着一个记录着被锁次数的计数器。未被锁定的对象的该计数器为0,当一个线程获得锁(执行monitorenter)后,该计数器自增变为 1 ,当同一个线程再次获得该对象的锁的时候,计数器再次自增。当同一个线程释放锁(执行monitorexit指令)的时候,计数器再自减。当计数器为0的时候。锁将被释放,其他线程便可以获得锁。
无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的,在Java虚拟机(HotSpot)中,Monitor是基于C++实现的,由ObjectMonitor实现。
synchronized与原子性
通过monitorenter和monitorexit指令,可以保证被synchronized修饰的代码在同一时间只能被一个线程访问,在锁未释放之前,无法被其他线程访问到。因此,在Java中可以使用synchronized来保证方法和代码块内的操作是原子性的。
synchronized与可见性
可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。所以,就可能出现线程1改了某个变量的值,但是线程2不可见的情况。
synchronized修饰的代码,在开始执行时会加锁,执行完成后会进行解锁。而为了保证可见性,有一条规则是这样的:对一个变量解锁之前,必须先把此变量同步回主存中。这样解锁后,后续线程就可以访问到被修改后的值。所以,synchronized关键字锁住的对象,其值是具有可见性的。
synchronized与有序性
synchronized保证有序性其实也和as-if-serial语义有关。as-if-serial语义的意思指:不管怎么重排序(编译器和处理器为了提高并行度),单线程程序的执行结果都不能被改变。编译器和处理器无论如何优化,都必须遵守as-if-serial语义。简单说就是,as-if-serial语义保证了单线程中,指令重排是有一定的限制的,而只要编译器和处理器都遵守了这个语义,那么就可以认为单线程程序是按照顺序执行的。当然,实际上还是有重排的,只不过我们无须关心这种重排的干扰。由于synchronized修饰的代码,同一时间只能被同一线程访问。那么也就是单线程执行的。所以,可以保证其有序性。
volatile
volatile是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。volatile通过禁止高速缓存和防止指令重排序保证了可见性和有序性问题。
Java中关键字总结汇总相关推荐
- java 中关键字_java中关键字一览
开始学习java了,今天学了java中的关键字,给大家分享以下. java中有50个关键字(含两个保留字),没有算true,false,null,简单一点,列个表格出来,仿照着:abstractcon ...
- java 中关键字_Java中的关键字
Java中的关键字一共有53个,包含常用的51个关键字和2个保留字 1. 保留字 2个:预留的关键字,即Java中未被使用到的关键字 const 保留字,即预留的关键字 goto 保留字,即预留的 ...
- java中关键字_java中的关键字是什么?
展开全部 访问控制: private 私有的 protected 受保护的 public 公共的 类.方法和变量修饰符 abstract 声明抽象 class 类 extends 扩允,继承 fina ...
- Java中关键字、保留字和标识符
Java基本语法 文章目录 Java基本语法 1.1 关键字 1.2 保留字 1.3 标识符 1.3.1 Java中的名称命名规范 确定是你想要的 1.1 关键字 关键字keyword: 定义:被 J ...
- Java中关键字packag和import的使用
文章目录 package的使用 基础理解 JDK中主要的包介绍 包的作用 MVC设计模式 模型层 model 主要处理数据 控制层 controller 处理业务逻辑 视图层 view 显示数据 im ...
- java中void的含义_void在Java-java中void后面接什么-java中关键字void的含义
JAVA里VOID是什幺意思. void是无返回值的意思. 比方说 public void walk() { System.out.print("你好!"); } 如果别的地方调用 ...
- java中关键字volatile的作用(转载)
转载:http://blog.csdn.net/orzorz/article/details/4319055 用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对 ...
- java中关键字、标识符、常量、变量、数据类型
关键字: JAVA语言中已经定义好的具有特殊含义的单词,被称为关键字,关键字是全小写无特殊字符的纯 英文字母,在编辑器中一般有高亮效果,如public.class.static等. 标识符: 在JAV ...
- Java 中关键字transient引出序列化与反序列化
一:transient(临时的)关键字 1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的. 2.被transient关键字修饰的变量不 ...
最新文章
- visjs使用小记-1.创建一个简单的网络拓扑图
- 霍金遗作《十问:霍金沉思录》出版 马化腾作跋纪念
- spring整合SpringMVC Controller 和 Struts2 Action控制层Bean的默认作用域
- NPDP认证怎么考?有用吗?
- Android 从WebServer 获取PDF转图片
- 超级计算机 天河三号,中国新一代百亿亿次超算“天河三号”问世!再创世界纪录...
- layui标签页切换并自动刷新
- MATLAB-自动控制原理-时域分析
- 江南大学计算机技术专业教学评估结果,江南大学学科评估结果及排名情况怎样...
- 程序员老黄历Java源码实现
- PHP中使用ZipArchive扩展压缩整个文件夹和过滤指定文件
- HTML5+CSS3笔记
- 小米开源数据库中间件gaea
- 360手机卫士插件化RePlugin今日开源,官方全面解读
- 智能交通应用GPS北斗定位模块
- spring prototype 使用场景
- 项目施工阶段的BIM主流应用,主要集中在哪些环节?
- 独孤思维:刷新赚钱认知
- Spring5——(一)spingIOC(入门介绍,spring创建bean,依赖,注入,注解方式)
- VLSI数字信号处理系统——第一章数字信号处理系统导论