New Features Of JDK - JDK9 Modular System

Modular System 是 JAVA9 中提供的新特性,它从一个独立的开源项目而来,名为 Jigsaw Project。在此之前,我们对于 Java 技术栈中模块化的认知是基于 OSGI 的,实际上 OSGI 也确实形成了它自己独有的体系,并且是一定程度上的行业标准。

阅读更多

启动一个没有 main 函数的 java 程序

原文:https://juejin.cn/post/6918637397857009677

作为一名 JAVA 开发者,不知道大家有没有去想过,JAVA 程序为什么一定要从 main 函数执行开始,其实关于这个话题,我大概从网上搜了下,其实不乏有 main 方法是我们学习Java语言学习的第一个方法,也是每个 java 使用者最熟悉的方法, 每个 Java 应用程序都必须有且仅有一个 main 方法 这种说法。那么真的是这样吗?今天就来聊聊这个事情。

阅读更多

聊一聊 CopyOnWriteArraySet 的迭代删除

上周在工程中涉及到一个清理 Set 集合的操作,将满足设定条件的项从 Set 中删除掉。简化版本代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
Set<String> sets = new CopyOnWriteArraySet<>();
sets.add("1");
sets.add("3");
sets.add("3");
sets.add("4");
Iterator<String> iterator = sets.iterator();
while (iterator.hasNext()){
iterator.remove();
}
System.out.println(sets);
}

这个看起来是个很常规的问题,没有验证就直接发了线下环境,然后就收到了业务方反馈的服务无法正常使用的问题了。

阅读更多

响应式编程 Reactor

从响应式编程说起

响应式编程是一种关注于数据流(data streams)和变化传递(propagation of change)的异步编程方式。 这意味着它可以用既有的编程语言表达静态(如数组)或动态(如事件源)的数据流。

在响应式编程方面,微软跨出了第一步,它在 .NET 生态中创建了响应式扩展库(Reactive Extensions library, Rx)。接着 RxJava 在 JVM 上实现了响应式编程。后来,在 JVM 平台出现了一套标准的响应式 编程规范,它定义了一系列标准接口和交互规范。并整合到 Java 9 中(Flow 类)。

阅读更多

聊一聊-JAVA 泛型中的通配符 T,E,K,V,?

前言

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

阅读更多

聊一聊 JAR 文件和 MANIFEST.MF

在 JAVA 语言这个圈子里面摸爬滚打,除了对于语言层面和框架层面的学习之外,有一些东西它一直存在,但是确没有对它们有足够的重视,因为都觉得它是理所当然,比如 JAR 是个什么?

提到 JAR,最先可能想到的就是依赖,比如 fastjson.jar ,它可以作为依赖在项目中来引用,但是不能通过 java -jar 来执行,这种就是非可执行的 JAR。另外一种,比如我们项目打包之后生成的 JAR (当然也可能是 war),我们可以通过 java -jar 来运行程序,我们把它称之为可执行的 JAR。

阅读更多

并发编程-关于 CAS 的几个问题

CAS 相关基础知识

CAS的全称是Compare And Swap ,即比较交换。CAS 中一般会设计到3个参数:

  • 内存值 V
  • 旧的预期值A
  • 要修改的新值B

当且仅当预期值 A 和内存值 V 相同时,将内存值V修改为 B,否则什么都不做。

这里关于 CPU 指令对于 CAS 的支持不深入研究,有兴趣的可以自行了解。

阅读更多

JUC·ThreadPoolExecutor 线程池

原文:https://juejin.cn/post/6844903560899985415

ThreadPoolExecutor算是JUC中最常用的类之一了。ThreadPoolExecutor,顾名思义,thread-pool-executor,硬翻译就是“线程-池-执行者”;java中,通过ThreadPoolExecutor可以很容易的创建一个线程池。但是我们为什么要使用线程池?呢?它能够带来什么样的优势呢?它又是怎么实现的呢?OK,带着这几个问题,我们来学习一下JAVA中的线程池技术。

阅读更多

JUC·Executor 框架

原文:https://juejin.cn/post/6844903560371503112

前言

多线程和并发这两个东西真的是向往已久,总是有一种神秘的感觉,想去探索一波,又担心水平不够无法驾驭。想以读书笔记的方式来写,但是又觉得缺少自己的一些思考;但是在没有足够并发编程经验的情况下又没法去写出很深刻的东西,毕竟没有踩过坑。所以在阅读spring源码的同时,也想抽点时间来看一看JUC的东西,关于这块只能说是记录自己学习JUC的一个过程,尝试用一些具体的代码demo来加深理解。所以就把本系列写成《【 初识】-JUC·XXXX》,用来让自己打开并发编程的大门。

阅读更多

怎么写一个死锁?

原文:https://juejin.cn/post/6844903520886325255

看着看着就想着怎么能写一个死锁呢,打开 eclipse,突然感觉无从下手;之前都是一直在解决阻塞、死锁这些问题,现在反过来去写一个死锁感觉有点莫名奇妙。。。

ok, 写一个死锁就要有一种场景,并且满足死锁的条件。

  • 互斥条件:一个资源每次只能被一个进程使用。
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
阅读更多