Concurrency标签导读
# 前言 现在你看到的并发标签是我第二次重制版,第一次的并发系列文章比较散乱,当时也是处于初学阶段,心态不够沉稳,很多东西看不清晰就写了博客,所以这次打算好好改一下。 个人观点:Java 并发需要分为两个部分学习,一部分为操作系统级别的并发知识,另一部分才是 j.u.c 包。考虑到整个体系的知识量过于庞大,所以本系列前几篇长篇文章,都会用于简述第一部分的内容,概述操作系统的并发和 Java 为了并发而做出的努力,如内存模型,类设计,并发关键字等。然后剩下的文章才是对 j.u.c 包中各个类的应用解释,该部分我们会阅读大量源码,有些类我们会着重讲解,像 AQS...
more...Java基础--SPI机制
# SPI 机制详解 SPI(Service Provider Interface),是 JDK 内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。 必看视频:10 分钟让你彻底明白 Java SPI,附实例代码演示 #安员外很有码 这个教学视频讲的详略得当,还有代码实战。 从 SPI 机制就可以看出,接口的存在是多么的重要,比如 java.sql.Driver 接口,其他不同厂商可以针对同一接口做出不同的实现,而我们只需要调用接口即可,根本不关心实现是怎么样的,SPI 机制主要思想就是将装配的控制权转移到程序之外。整个学习过程你需要牢记一个词 ——...
more...Redis入门(6)--主从与哨兵
本章讲解 redis 配置主从复制和哨兵模式 # 主从复制 主从赋值是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点 (Master),后者称为从节点 (Slave),数据的复制是单向的,只能由主节点到从节点。Master 以写为主,Slave 以读为主。 优点: 读写分离,提高性能。 主要是读多写少的场景下,可以为一个主节点安排很多个从节点,这样就能分担压力,即使挂掉一个,其他的也可以使用。 首先要启动两个 Redis 服务器,修改以下配置文件,注意这两个配置文件的端口不能一样(因为是放在一个虚拟机上跑的),我这里是 port1 = 6890...
more...Java基础--异常机制
# 异常机制 先看类结构,再学使用,不然讲使用的时候会有点懵。 # 异常层次结构 Java 异常都是对象,是 Throwable 子类的实例。Java 通过 Throwable 众多子类描述各种不同的异常,描述出现在一段编码中的错误条件,当条件生成时,错误就会引发异常。 错误比异常更严重,当出现时,JVM 直接就崩了,本文主要讲的还是异常。 Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。 对于异常,分为两种: 运行时异常 都是 RuntimeException 类及其子类,比如...
more...Java基础--注解机制
# 注解机制 在之后的开发中,注解是一定离不开的,所以前期的学习就要打好基础。注解的出现极大便利了开发过程,很多需要很麻烦的配置,代码之类的,都通过注解得以简化。其作用表现如下: 生成文档,通过代码里标识的元数据生成 javadoc 文档。 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。 # 内置注解 JDK 内置了以下注解: @Override -...
more...Java基础--反射机制
# 反射基础 RTTI(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是 “传统的” RTTI,它假定我们在编译时已经知道了所有的类型;另一种是 “反射” 机制,它允许我们在运行时发现和使用类的信息。 反射就是把 java 类中的各种成分映射成一个个的 Java 对象(比如 Method 对象, Field 对象)。 Q:反射如何允许我们在运行时使用类信息?这些类信息哪来的? # Class 类 Class 类的实例表示 java...
more...Java基础--泛型机制
# 泛型机制 重视基础,基础不牢,地动山摇。 泛型出现前,想要在一个类中存储的数据可以是不同的类,就只有写成 Object,比如集合 List,就只能是 Object[] ,而不是 T[] 。这样写会出现的问题是,使用 List 的人需要在取出数据时强制转换。 String s = (String)list.get(0);但是 Object 在编译阶段并不具备良好的类型判断能力,也就是说: List list = new ArrayList(); // 假设现在还没有泛型list.add(123);String s = (String)list.get(0); //...
more...