1:transient
当对象被序列化时,transient阻止其修饰的对象进行序列化;当反序列化时,此对象的值不会被恢复。
2:instanceof
判断引用指向的对象,是不是某个类及其子类的实例对象;

class Person {}public class Man extends Person {public static void main(String[] args) {if("111" instanceof String) {System.out.println("所有字符串都是String类型");}Person man = null;//尚未初始化,指向的对象为null,不是任何类的对象if(man instanceof Man) {System.out.println("man 是Man的对象");}if(man instanceof Person) {System.out.println("man 是Person的对象");}man = new Man();//初始化之后if(man instanceof Man) {System.out.println("man 是Man的对象");}if(man instanceof Person) {System.out.println("man 是Person的对象");}}}

输出如下:

所有字符串都是String类型
man 是Man的对象
man 是Person的对象

3:volatile
volatile是Java提供的轻量级的线程同步机制,与之相对,synchronized通常被称为重量级锁。
volatile有两个特性:

  1. 保证共享变量对所有线程的可见性;

  2. 禁止指令重排序优化;
    Java多线程内存模型简要描述如下:

    volatile保证可见性的方式为:

  3. 当写一个共享变量时,JMM(Java Memory Model)会把该线程对应的本地内存中的变量强制刷新到主内存中;

  4. 这个写操作会导致其他线程的本地内存中的缓存无效;

对于num++这类的复合操作,只使用volatile无法保证其原子性;可以通过synchronized或其他的锁机制、CAS机制来保障(参见后续文章)

volatile禁止指令重排序:
volatile修饰变量,在编译时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序;
volatile禁止指令重排序的一些规则:

  1. 当第二个操作是volatile写时,无论第一个操作是什么,都不能进行重排序;
  2. 当第一个操作是volatile读时,无论第二个操作是什么,都不能进行重排序;
  3. 当第一个操作是volatile写,第二个操作是volatile读时,不能进行重排序;

3.1:volatile拓展,Java JMM的happens-before原则规则:


  《JSR-133:Java Memory Model and Thread Specification》对happens-before关系的定义如下:

1.如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。

2.两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,那么这种重排序并不非法。

上面1是JMM对程序员的承诺。从程序员的角度来说,可以这样理解happens-before关系:如果A happens-before B,那么Java内存模型将向程序员保证——A操作的结果将对B可见,且A的执行顺序排在B之前。注意,这只是Java内存模型向程序员做出的保证!

上面2是JMM对编译器和处理器冲排序的约束。MM其实是在遵循一个基本原则:只要不改变程序的执行结果,编译器和处理器怎么优化都行。happens-before这么做的目的,都是为了在不改变程序执行结果的前提下,尽可能地提高程序执行的并行度。

三.happens-before规则

1.程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作

2.监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁

3.volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读

4.传递性:如果A happens-before B,且B happens-before C,那么A happens-before C

5.start规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作

6.join规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。
参考链接:https://www.cnblogs.com/chenssy/p/6393321.html

4:synchronized

偷个懒,放个链接(PS:这个博主写的真好)
https://www.cnblogs.com/mingyao123/p/7424911.html
回头再回顾下多线程那本书

5:final
final总体表达不可变的语义,final的四种用法:

  1. 修饰数据:包括成员变量和局部变量。该变量只能被赋值一次且它的值无法被改变。对于成员变量来说,只能在声明处或者构造方法中赋值
  2. 修饰方法参数:表示这个参数在方法生命周期中不能被重新赋值
  3. 修饰方法:表示该方法无法被重写;
  4. 修饰类:表示该类无法被继承;

6:static

  1. 修饰属性,使其成为类属性,此类的所有对象共享此属性;
  2. 修饰方法,使其成为类方法,调用时可直接使用类名.方法名来调用,就不用再创建对象;
  3. 修饰代码块,一般用于类成员的初始化;
  4. 静态引入(import static),通过静态引入的静态属性或静态方法,可以直接用名称引用,不用使用类名.的形式;

7:const
const是Java中的预留关键字,类似预留关键字还有goto。目前暂时没用。C语言中const类似final。

Java修炼之路——基础篇——Java关键字相关推荐

  1. Java修炼之路——基础篇——Java集合类详解2

    Set和List区别?Set如何保证元素不重复? Set.List都实现了Collection接口,List是有序的列表,Set是无序的集合(TreeSet有序) List实现类: ArrayList ...

  2. Java修炼之路——基础篇——Java集合类详解1

    SynchronizedList和Vector的区别 java.util.Vector java.util.Collections.$SynchronizedList Vector用同步方法,Sync ...

  3. Java修炼之路——基础篇——值传递

    什么是值传递?引用传递? 值传递:值传递是将变量的一个副本传递到方法中,方法中如何操作该副本,都不会影响原变量的值.引用传递:引用传递是将变量的地址传递到方法中,方法中操作该变量,会对其产生影响. 为 ...

  4. Java修炼之路——基础篇——枚举

    枚举的用法 每个枚举变量其实都是枚举类的一个实例. 枚举与单例 各种模式的单例模式,包括枚举实现的单例 //懒汉模式 class SingletonA {private static Singleto ...

  5. Java修炼之路——基础篇——数据类型

    基础数据类型: 整型(byte short int long ).浮点型.布尔型.字符型boolean:只表示一位的信息,true,false.默认为false,基本上占一字节char: 16位,2字 ...

  6. Java修炼之路——基础篇——String

    String 1:字符串的不可变性 什么是不可变对象?不可变对象是指创建后无法变更的对象 String为什么是不可变的?String类为final,并且内部字符数组也为final.所以String对象 ...

  7. Java修炼之路——基础篇——平台无关性

    Java如何实现平台无关性? 首先说无论是哪种语言,都需要经过操作系统和CPU来完成程序的运行.平台无关性指的是程序不会因为操作系统和处理器的不同而不能运行或者发生运行错误.而不同的CPU和OS组成的 ...

  8. JAVA学习之路--基础篇三

    目录 关于Java中从键盘输入的语句 nextxxx().next().nextLine()的区别 语句 if和if else语句 Switch语句 for语句 while和do..while bre ...

  9. java程序试岗内容_java程序员修炼之路基础篇四:继承

    上一篇文章我跟大家聊了一下"封装",今天我们聊一下同样作为java语言三大特征之一的"继承". 简单说"继承"就是从一个已知类派生出新类的过 ...

最新文章

  1. 扔掉Swagger,试试这款功能强大,零注解侵入的API接口文档生成工具!
  2. ASP.NET Split(字符文本中的字符太多 解决方法)
  3. 作者:张宇中(1969-),男,中国电信股份有限公司云计算分公司首席数据分析师、大数据分析顾问。...
  4. [计算机系统] - 链接
  5. SharePoint 站点出现Http 503 错误
  6. spark加载数据的方式
  7. Java经典设计模式(1):五大创建型模式(附实例和详解)
  8. 通过双击运行linux脚本
  9. 算法导论第三版 第30章习题答案
  10. java去除对象属性空格_JAVA 对象中去除空格
  11. vin端口是什么意思_5G新在哪儿(6)?-天线端口的故事
  12. Strurts(四)——从Struts原型模拟看大道至简(含实例下载)
  13. typescript 之 keyof
  14. 微信小程序-云开发 起步
  15. Ubuntu不能连接XShell、主机Ping不通虚拟机,但虚拟机能ping通主机
  16. 从安装到连接,教你如何连上Mysql数据库
  17. 抱歉,您的 Microsoft 帐户出现问题。请转到 https://account.live.com 寻求帮助”
  18. php浮点转int少1,PHP中浮点数计算比较及取整不准确的解决方法
  19. Trello中的Scrum
  20. 【Java】恭喜你,你的代码获奖了(编写代码的151的建议)

热门文章

  1. python用pandas读取excel_Python使用pandas读取Excel文件数据和预处理小案例
  2. 10个遥远但近在人间的天堂!
  3. 在杭州,吃过这60样东西,人生才算完美!
  4. 全球顶级大学,在中国录取率却不足0.5%,答案一针见血!
  5. 大变天!刚刚,山东突然宣布!关乎800万人...
  6. 掌握这四点核心思想,统计学才算入门
  7. 鸿蒙蕴含的哲理,经典别致的人生语录,蕴含哲理,受用一生!
  8. 表3.5 文章管理测试用例表_本地管理表空间管理机制
  9. 评价的等级优良差_满意程度等级划分
  10. table 内 下拉列表 被遮挡_一个简洁、有趣的无限下拉方案