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

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多线程内存模型简要描述如下:
    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原则规则:

JMM设计示意图
  《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。

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

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

相关文章

.NetCore从零开始使用Skywalking分布式追踪系统

将本文从0开始搭建两个webapi项目,使用Skywalking来追踪他们之间的调用关系及响应时间。开发环境为VisualStudio20191:安装Skywalking,可参考:https://www.cnblogs.com/sunyuliang/p/11422576.html,本列中搭建好后的Skywalking服务…

通过Service访问应用 (1)

目录通过Service访问应用 通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用通过之前的操作,应用部署完成了,我们的Demo网站已经成功启动了,那么如何访问网站呢?通过Pod IP访问应用我们可以通过Pod IP…

13张PPT带你了解主动式消息队列处理集群

前言偷偷和你们说,我搞了一份内部资料,该内部资料共有13张PPT,据作者透露,该PPT至少花了整整1周时间才编写完成,其内容简洁明了,内容深度足够,易于初学者理解,也给深度开发人员分享了…

.Net Core 三大Redis客户端对比和使用心得

前言稍微复杂一点的互联网项目,技术选型都可能会涉及Redis,.NetCore的生态越发完善,支持.NetCore的Redis客户端越来越多,下面三款常见的Redis客户端,相信大家平时或多或少用到一些,结合平时对三款客户端的使…

队长开卖自家产“翠香”猕猴桃

猕猴桃品种有很多,但不是所有的果子都叫翠香。这两天我在公众号里卖了这个翠香猕猴桃,可能是有同学以为是做广告卖水果,其实是家里的亲戚猕猴桃成熟了,辛苦一年下来地里一共结了3000斤猕猴桃,遇到了一个难题就是如何把…

Java修炼之路——基础篇——Java集合类

集合类的全景图 常用集合类特性 1. Collection:每个位置对应一个元素1.1: List 存放有序元素,允许重复元素,允许元素为null1.1.1: ArrayList:内部结构为数组;初始容量为10;插入、删除的移动速度慢&#x…

小卓.NET中文编程特点介绍

大家好,我在介绍一下我的全新编程语言-卓语言。小卓编程是卓语言的一个开发工具,可以在里面实现绘图、动画、事件响应等等功能。关于中文编程,一直以来都有争议。我针对以往中文编程的缺点而开发了一种全新的编程语言。首先 &…

2019-02-28-算法-进化(盛最多水的容器)

题目描述 给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以…

CAP 2.6 版本发布通告

前言今天,我们很高兴宣布 CAP 发布 2.6 版本正式版。同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了3000 Star.自从上次 CAP 2.5 版本发布 以来,已经过去了几个月的时间,关注的朋友可能知道,在这几个月的时间里,也…

求助:现在有一个可以进体制“养老”的坑,我该不该跳?

对不起,在当下互联网人生活的环境中,并没有可以“养老”的坑。对不起,在当下互联网人生活的环境中,也没有绝对”稳定“的企业。技术人的职业发展,以”适者生存“为核心原则,每一种职业环境都有相应的职业成…

给 asp.net core 写个中间件来记录接口耗时

给 asp.net core 写个中间件来记录接口耗时Intro写接口的难免会遇到别人说接口比较慢,到底慢多少,一个接口服务器处理究竟花了多长时间,如果能有具体的数字来记录每个接口耗时多少,别人再说接口慢的时候看一下接口耗时统计&#x…

Docker(二)-在Docker中部署Nginx实现负载均衡【完整教程】

一、前言【查看完整视频教程(免费),请拉直文尾】在前面的文章中我们已经介绍了如何在Centos7系统中安装Docker以及利用Docker进行Asp.Net Core应用的部署。在本文中,我们将继续介绍利用Docker部署Nginx服务实现负载均衡。文章最后…

设置ABP默认使用中文

ABP提供的启动模板, 默认使用是英文:虽然可以通过右上角的菜单切换成中文, 但是对于国内项目来说, 默认使用中文是很正常的需求.前期准备使用ABP CLI创建一个名为AbpStudy的ASP.NET MVC项目:abp new AbpStudy关于MVC的启动模板可以看文档, 这里就不赘述.使用ABP版本的是当前最新…

基础篇--Java IO--概览

字符流、字节流、输入流、输出流 Java 中使用IO(输入输出)来读取和写入,读写磁盘文件、内存、网络数据。输入输出是相对内存而言,往内存中读数据就为输入流,从内存中往外写就是输出流。 根据处理类型分为字符流、字节…

.NET轻松写博客园爬虫

爬虫,是一种按照一定的规则,自动地抓取网站的程序或者脚本。.NET写爬虫非常简单,并能轻松优化性能。今天我将分享一段简短的代码,爬出博客园前200页精华内容,然后通过微小的改动,将代码升级为多线程爬虫&am…

kettle同步数据中文乱码问题解决

最近在使用kettle进行数据同步的时候,发现同步来的中文数据产生了乱码。试了下网上的解决方案,最终解决了这个问题。步骤如下: 1:kettle中配置源数据库、目标数据库编码 2:编辑“表输入”,去掉勾选“允许建…

WTM重磅更新,LayuiAdmin免费用 and more

从善如登,从恶如崩。对于一个开发人员来说,那就是做一个好的系统不容易,想搞砸一个系统很简单,删库跑路会还不会么。对于我们开源框架的作者来说,做一个好的框架就像登山(也许是登天)&#xff0…

kettle数据库操作OPTION SQL_SELECT_LIMIT=DEFAULT问题解决

今天在使用kettle配置数据库映射的时候,有如下报错: Couldnt get field info from [select * from pre_user_base_bak]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax …

.netcore 分布式事务CAP2.6 快速入门

CAP介绍:CAP是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案。可以解决跨服务器的数据一致性问题。一个简单的列子,如:订单系统创建订单后需要通知邮件通知用户下单成功,解决方案有下面几种&#xff1…

#3601. 一个人的数论

#3601. 一个人的数论 首先这个转化还是很巧妙的,或者很套路的,直接莫比乌斯反演,然后看到了自然数幂之和的形式,那么我们就可以转化为多项式处理,项数就减少到了d1,然后看到题目给出的都是质因数分解结果&a…