Java
文章平均质量分 80
安正勋
点点滴滴,皆是学问,看到了、学会了、记住了,便是收获、便是进步。
展开
-
不可不说的 Java “锁”事
文章目录前言1. 乐观锁 VS 悲观锁2. 自旋锁 VS 适应性自旋锁3. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁无锁偏向锁轻量级锁重量级锁4. 公平锁 VS 非公平锁5. 可重入锁 VS 非可重入锁6. 独享锁 VS 共享锁结语前言Java 提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自 JDK 8 和 Ne...转载 2020-05-08 14:36:14 · 807 阅读 · 1 评论 -
深入理解 Java 线程池的实现原理
文章目录1 线程状态2 线程池2.1 线程池的作用2.2 线程池的实现1 线程状态既然要说线程,我们就先来了解一下线程的几种状态: public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;...原创 2021-01-08 19:46:46 · 1524 阅读 · 4 评论 -
新一代垃圾回收器 ZGC 的探索与实践
文章目录GC之痛ZGC(The Z Garbage Collector)是 JDK 11 中推出的一款低延迟垃圾回收器,它的设计目标包括:停顿时间不超过 10ms;停顿时间不会随着堆的大小,或者活跃对象的大小而增加;支持 8MB ~ 4TB 级别的堆(未来支持 16TB)。从设计目标来看,我们知道 ZGC 适用于大内存低延迟服务的内存管理和回收。本文主要介绍 ZGC 在低延时场景中的应用和卓越表现,文章内容主要分为四部分:GC 之痛:介绍实际业务中遇到的 GC 痛点,并分析 CMS 收集器转载 2020-08-15 14:16:33 · 2358 阅读 · 0 评论 -
详述 Java NIO 以及 Socket 处理粘包和断包方法
NIO 是 New I/O 的简称,是 JDK 1.4 新增的功能,之所以称其为 New I/O,原因在于它相对于之前的 I/O 类库是新增的。由于之前老的 I/O 类库是阻塞 I/O,New I/O 类库的目标就是要让 Java 支持非阻塞 I/O,所以也有很多人喜欢称其为 Non-block I/O,即非阻塞 I/O。NIO 的文件读写设计颠覆了传统 IO 的设计,采用『通道』+『缓存区』使得新式的 I/O 操作直接面向缓存区。NIO 弥补了原来同步阻塞 I/O 的不足,它在标准 Java 代码中提原创 2020-07-04 12:23:42 · 2554 阅读 · 1 评论 -
由阿里巴巴 Java 开发规约 HashMap 条目引发的故事
大热的《[阿里巴巴 Java 开发规约](https://github.com/alibaba/p3c/)》中有提到:- 【推荐】集合初始化时,指定集合初始值大小。说明:`HashMap`使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(`16`)即可:```java public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); }```转载 2020-06-24 07:24:33 · 2766 阅读 · 5 评论 -
详述 Java 并发编程中 CAS 以及 AQS 的实现原理
CAS什么是 CAS?CAS 的应用CAS 的缺点AQS什么是 AQS?AQS 的应用AQS 实现原理浅析CAS什么是 CAS?CAS(Compare And Swap),即比较并交换,是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS 操作包含三个操作数——内存位置V、预期原值A和新值B。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值;否则,处理器不做任何操作。无论哪种情况,它都会在 CAS .原创 2020-06-07 10:08:11 · 1928 阅读 · 0 评论 -
详述 ThreadLocal 的实现原理及其使用方法
文章目录实现原理ThreadLocal 的 get 方法ThreadLocal 的 set 方法ThreadLocal 的特性使用方法Threadlocal是一个线程内部的存储类,可以在指定线程内存储数据,并且该数据只有指定线程能够获取到,其官方解释如下:/** * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thre原创 2020-05-30 18:21:27 · 2675 阅读 · 1 评论 -
详述 synchronized 和 volatile 的实现原理以及两者的区别
版权声明:本文的内容大都来自于「zejian_」的博文,略作修改。文章目录线程安全synchronized使用方式作用于实例方法作用于静态方法作用于同步代码块实现原理同步代码块同步方法其他可能需要了解的关键点可重入性线程中断等待唤醒机制volatile内存可见性禁止指令重排优化synchronized 和 volatile 的区别线程安全在并发编程中,线程安全是我们最需要关心的问题,而导致并发问题的原因,主要是:存在共享数据;并且,存在多条线程共同操作共享数据。因此,为了解决这个问题,我.原创 2020-05-24 19:22:31 · 2730 阅读 · 0 评论 -
IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
温馨提示:本教程的 GitHub 地址为「intellij-idea-tutorial」,欢迎感兴趣的童鞋Star、Fork,纠错。在「详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法」一文中,我们已经将 IntelliJ IDEA 中的 Maven 项目的框架搭建完成。接着上文,在本文中,我们更近一步,利用 Tomcat 运行我们的 Web 项目...原创 2018-04-23 20:28:29 · 12649 阅读 · 2 评论 -
编程思想 之「数组、容器」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。我们说,“Java 是面向对象的编程语言”,Java 中的所有行为都是围绕对象进行的,那么 Java 是如何持有对象的呢?实际上,在 Java 中,持有对象的方法只有两种,分别为:数组;容器。接下来,我们就来看看 Java 是如何使用数组...原创 2018-04-21 16:53:58 · 964 阅读 · 0 评论 -
编程思想 之「Java I/O 系统」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。对程序语言的设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务。任务的难度大多数来自于要覆盖所有的可能性,不仅存在各种 I/O 源端和想要与之通信的接收端(如文件、控制台、网络链接等),而且还需要以多种不同的方式与它们进行通信(如顺序、随...原创 2018-05-06 11:30:05 · 996 阅读 · 0 评论 -
效率编程 之「枚举和注解」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。第 1 条:用enum代替int常量枚举类型是指由一组固定的常量组成合法值的类型,例如人的性别、中国的省份名称等。在 Java 1.5 发行版之前,表示枚举类的常用模式是声明一组具名的int常量,每个类型成员一个常量:public cl...原创 2018-06-06 08:42:51 · 1122 阅读 · 0 评论 -
编程思想 之「容器深入研究」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。容器深入研究在「数组、容器」这篇博文中,我们已经介绍了 Java 容器类库的相关概念及基本特性,这对于使用容器来说已经够用了。在本篇博文中,我们则是要对容器进行更深层次的研究!首先,给出容器类库的比较完备的构件图:如上图所示,我们可以将...原创 2018-04-22 15:33:58 · 768 阅读 · 0 评论 -
编程思想 之「泛型」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。对于一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义类型。如果我们要想编写可以应用于多种类型的代码,这种限制就会对代码产生非常大的束缚。在面向对象的语言中,多态算是一种泛化的机制,因为我们可以将方法的参数类型设为基类,那么该方法就可以接...原创 2018-03-29 09:52:27 · 707 阅读 · 0 评论 -
编程思想 之「字符串」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。字符串字符串(String)对象是不可变的,把String对象作为方法的参数时,其实都是复制一份引用,而该引用所指的对象一直待在单一的物理位置上,从未动过。我们可以给一个String对象起任意多的别名,因为String对象具有只读特性,所以指向...原创 2018-03-11 14:17:16 · 723 阅读 · 0 评论 -
编程思想 之「异常及错误处理」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。在 Java 的异常及错误处理机制中,用Throwable这个类来表示可以作为异常被抛出的类。Throwable对象可以细分为两种类型(指从Throwable继承而得到的类型),分别为:Error ,表示编译时和系统错误;Exception,表...原创 2018-03-10 12:27:15 · 4740 阅读 · 1 评论 -
编程思想 之「运行时类型识别、反射」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。运行时类型信息能够让我们在程序运行时发现和使用类型信息。在运行时识别对象和类的信息,主要有两个方式,分别为:一种是传统的RTTI,它假定我们在编译时就已经知道了所有的类型;另一种是反射机制,它允许我们在运行时发现和使用类的信息。在本章中,...原创 2018-03-16 09:09:22 · 1884 阅读 · 1 评论 -
编程思想 之「接口、内部类」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。在 Java 的语言体系中,类和接口是两种常见的定义对象的形式,内部类则是类的一种特殊形式。接口和内部类为我们提供了一种将抽象定义与具体实现相分离的更加结构化的方法。接口我们通过方法来描述对象的行为,一般来说,它含有方法体并且在方法体中描述...原创 2018-02-28 09:20:49 · 846 阅读 · 0 评论 -
编程思想 之「访问权限控制」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。访问权限控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键字)和private。public:任何类都可以访问;protected:该类的子类及同包的类可以访问;包访问权限:同包的类可以访问;private:只有原创 2017-12-30 14:50:39 · 1465 阅读 · 1 评论 -
效率编程 之「对于所有对象都通用的方法」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。第 1 条:覆盖equals时请遵守通用约定类可以提供一个公有的静态工厂方法,它只是一个返回类的示例的静态方法。例如,public static Boolean valueOf(boolean b) { return b ? Boo...原创 2018-05-27 12:01:04 · 758 阅读 · 0 评论 -
效率编程 之「类和接口」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。第 1 条:使类和成员的可访问性最小化要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。对于顶层的(非嵌套的)类和接口,只有两种可能的访问级别:包级私有(package-p...原创 2018-05-28 09:07:13 · 869 阅读 · 0 评论 -
效率编程 之「泛型」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。第 1 条:请不要在新代码中使用原生态类型———— ☆☆☆ —— 返回 -> 那些年,关于 Java 的那些事儿 <- 目录 —— ☆☆☆ ————...原创 2018-06-04 08:53:28 · 845 阅读 · 0 评论 -
并发实战 之「 基础构建模块」
委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。在本篇博文中,主要介绍一些比较有用的并发构建模块,特别是在 Java 5.0 和 Java 6.0 中引入的一些新模块,以及在使用这些模块来构造应用程序时的一些常用模式。同步容器类最早出现的同步容器类是Vector和Hashtable,在 JDK 1.2 及之后,又提供了一些功能类似的封装器类,这些同步容器类是由...原创 2018-11-17 10:22:52 · 608 阅读 · 0 评论 -
并发实战 之「 对象的共享及组合」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。对象的共享我们曾说过,要编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正常的管理。public class NoVisibility { private static boolean ready; private sta...原创 2018-10-27 10:23:27 · 614 阅读 · 2 评论 -
并发实战 之「 线程安全性」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。在早期的计算机中不包含操作系统,它们从头到尾只能执行一个程序,并且这个程序能访问计算机中的所有资源。在这种环境中,不仅程序难以编写和运行,而且对于昂贵且稀有的计算机资源来说也是一种浪费!为了实现较高的资源利用率、公平性以及便利性,这促使人们在计算机中加入操作...原创 2018-10-21 10:50:54 · 579 阅读 · 0 评论 -
虚拟机篇 之「垃圾收集与内存分配策略」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。垃圾收集器在 Java 对象被回收之前,首先需要判断该对象是否已经过期或者死亡?常见的判断一个对象是否过期的算法主要有两种,分别为:引用计数法算法:在对象创建时,为其设置一个默认值为 0 的引用计数器,每当有一个地方引用该对象时,引用计数...原创 2018-08-26 11:30:25 · 757 阅读 · 0 评论 -
虚拟机篇 之「运行时数据区域及虚拟机对象」
运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。这些区域被称为运行时数据区域,其具体划分大致如下图所示:程序计数器:它是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概...原创 2018-08-05 15:21:48 · 806 阅读 · 0 评论 -
效率编程 之「通用程序设计」
第 1 条:将局部变量的作用域最小化———— ☆☆☆ —— 返回 -> 那些年,关于 Java 的那些事儿 <- 目录 —— ☆☆☆ ————原创 2018-06-09 11:19:57 · 936 阅读 · 0 评论 -
效率编程 之「序列化」
对象序列化提供了一个框架,用来将对象编码成字节流,并从字节流编码中重新构建对象。“将一个对象编码成一个字节流”,称作将该对象序列化;相反的处理过程称为反序列化。一旦对象被序列化后,它的编码就可以从一台正在运行的虚拟机被传递到另一台虚拟机上,或者被存储到磁盘上,供以后反序列化时使用。序列化技术为远程通信提供了标准的线路级对象表示法,也为 JavaBean 组件结构提供了标准的持久化数据格式。第 ...原创 2018-06-23 10:09:21 · 929 阅读 · 0 评论 -
效率编程 之「方法」
第 1 条:检查参数的有效性以及必要时进行保护性拷贝绝对多数方法和构造器对于传递给它们的参数值都会有某些限制。例如,索引值必须是非空的、对象引用不能为null等。我们应该在文档中清楚地指明所有这些限制,并且在方法体的开头处检查参数,以强制施加这些限制。对于非公有的方法,我们也可以使用断言来检查它们的参数,例如下面的冒泡排序方法:private static void bubbleSort(...原创 2018-06-08 09:41:54 · 865 阅读 · 0 评论 -
效率编程 之「并发」
第 1 条:同步访问共享的可变数据关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。许多程序员把同步的概念仅仅理解为一种互斥的方式,即当一个对象被一个线程修改的时候,可以阻止另一个线程观察到对象内部不一致的状态。按照这种观点,对象被创建的时候处于一致的状态,当有方法访问它的时候,它就被锁定了。这些方法观察到对象的状态,并且可能会引起状态转变,即...原创 2018-06-13 09:26:26 · 884 阅读 · 0 评论 -
效率编程 之「异常」
第 1 条:对可恢复的情况使用受检异常,对编程错误使用运行时异常顾名思义,异常应该只用于异常的情况下;它们永远不应该用于正常的控制流。同理,设计良好的 API 不应该强迫它的客户端为了正常的控制流而使用异常。Java 程序设计语言提供了三种可抛出结构:受检的异常(checked exception),运行时异常(run-time exception)和错误(error)。在决定使用受检的异...原创 2018-06-12 09:03:28 · 889 阅读 · 0 评论 -
效率编程 之「创建和销毁对象」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。第 1 条:考虑用静态工厂方法代替构造器类可以提供一个公有的静态工厂方法,它只是一个返回类的示例的静态方法。例如,public static Boolean valueOf(boolean b) { return b ? Boole...原创 2018-05-23 20:44:29 · 848 阅读 · 0 评论 -
那些年,关于 Java 的那些事儿
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。 在编程这条路上走的越久,我们遇到的事情就越多,磕磕绊绊在所难免,很多坑只有在踩过之后,我们才会越能体会到那种「啊,原来是这么回事儿」的恍然大悟之感,这种体会并不局限于 Java 语言,所有编程语言皆是如此,之所以在此聊 Java,不过是作者接触 J...原创 2017-12-02 15:06:56 · 3820 阅读 · 5 评论 -
编程思想 之「继承、组合、fianl」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。提起「复用类」三个字,相信我们脑海中浮现的都是「组合」和「继承」,实际上,在 Java 中复用类的方法也确实是这两种。 继承Java 用super关键字表示超类(或称之为基类)的意思,意味着:当前类是从超类中继承而来的。当我们创建一个继承超类的导出类原创 2017-12-30 16:28:11 · 985 阅读 · 0 评论 -
编程思想 之「多态、初始化顺序、协变返回类型」
温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋Star、Fork,纠错。在面向对象的编程语言中,有三个特性,分别为:封装、继承和多态。实现多态的前提是继承,多态的作用是消除类型之间的耦合关系。对于多态,我们常说的词有两个,分别为:向上转型和向下转型。我们把对某个对象的引用视为其基类型的引用的做法,称之为向上转型;把对某个对象原创 2018-01-02 09:18:16 · 1589 阅读 · 0 评论 -
关于构造方法的那些事儿
1 前言 构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。在 Java 中,任何变量在被使用前都必须先设置初值,构造方法就是专门为类的成员变量赋初值的方法。2 特殊性 构造方法是一种特殊的成员方法,它的特殊性主要反映在如下几个方面:构造方法原创 2017-02-14 11:54:57 · 1133 阅读 · 2 评论 -
用 Java 模拟 TCP 传输的客户端和服务端
一、创建TCP传输的客户端1、建立TCP客户端的Socket服务,使用的是Socket对象,建议该对象一创建就明确目的地,即要连接的主机; 2、如果连接建立成功,说明数据传输通道已建立,该通道就是Socket流,是底层建立好的,既然是流,说着这里既有输入流,又有输出流,想要输入流或者输出流对象,可以通过Socket来获取原创 2016-12-11 21:06:37 · 5590 阅读 · 0 评论 -
用 Java 模拟 UDP 传输的发送端和接收端
一、创建UDP传输的发送端1、建立UDP的Socket服务; 2、将要发送的数据封装到数据包中; 3、通过UDP的Socket服务将数据包发送出去; 4、关闭Socket服务。原创 2016-12-11 09:03:12 · 3256 阅读 · 0 评论 -
网络爬虫二三事儿
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。原创 2016-12-13 09:53:08 · 1423 阅读 · 0 评论