王下邀月熊
王下邀月熊
个人网站:https://ng-tech.icu/
2021年05月03日入驻 合计 2 个作品 累计 58.41 万字 共有 2 订阅
  • JVM 内存分配

  • JDK

  • 线程池与线程安全

    线程多起来的话就需要管理,不然就会乱成一锅。我们知道线程在物理上对应的就是栈里面的一段内存,存放着局部变量的空间和待执行指令集。如果每次执行都要从头初始化这段内存,然后再交给 CPU 执行,效率就有点低了。假如我们知道该段栈内存会被经常用到,那我们就不要回收,创建完就让它在栈里面呆着,要用的时候取出来,用完换回去,是不是就省了初始化线程空间的时间,这样是我们搞出线程池的初衷。

    其实线程池很简单,就是搞了个池子放了一堆线程。既然我们搞线程池是为了提高效率,那就要考虑线程池放多少个线程比较合适,太多了或者太少了有什么问题,怎么拒绝多余的请求,除了异常怎么处理。首先我们来看跟线程池有关的一张类图。
  • RxJava

    RxJava 是 JVM 的响应式扩展(ReactiveX),它是通过使用可观察的序列将异步和基于事件的程序组合起来的一个库。
  • Akka

    Akka 是一个建立在 Actors 概念和可组合 Futures 之上的并发框架, Akka 设计灵感来源于 Erlang;Erlang 是基于 Actor 模型构建的。它通常被用来取代阻塞锁如同步、读写锁及类似的更高级别的异步抽象。Netty 是一个异步网络库,使 Java NIO 的功能更好用。Akka 针对 IO 操作有一个抽象,这和 netty 是一样的。使用 Akka 可以用来创建计算集群,Actor 在不同的机器之间传递消息。从这个角度来看,Akka 相对于 Netty 来说,是一个更高层次的抽象

    Akka 是一种高度可扩展的软件,这不仅仅表现在性能方面,也表现在它所适用的应用的大小。Akka 的核心,Akka-actor 是非常小的,可以非常方便地放进你的应用中,提供你需要的异步无锁并行功能,不会有任何困扰。你可以任意选择 Akka 的某些部分集成到你的应用中,也可以使用完整的包——Akka 微内核,它是一个独立的容器,可以直接部署你的 Akka 应用。随着 CPU 核数越来越多,即使你只使用一台电脑,Akka 也可作为一种提供卓越性能的选择。Akka 还同时提供多种并发范型,允许用户选择正确的工具来完成工作。
  • Netty

    Netty 是一个异步网络库,使 Java NIO 的功能更好用。
  • NIO

    标准的 Java IO API,你操作的对象是字节流(byte stream)或者字符流(character stream),而 NIO,你操作的对象是 channels 和 buffers。数据总是从一个 channel 读到一个 buffer 上,或者从一个 buffer 写到 channel 上。比如一个线程里,可以从一个 channel 读取数据到一个 buffer 上,在 channel 读取数据到 buffer 的时候,线程可以做其他的事情。当数据读取到 buffer 上后,线程可以继续处理它。

    Java NIO 有三个核心组件(core components):Channels、Buffers、Selectors。
  • BIO,NIO 与 AIO

    除信号驱动模型外,Java 对其它四种 IO 模型都有支持;其中 Java 最早提供的 blocking IO 即是阻塞 IO,而 NIO 即是非阻塞 IO,同时 NIO 中的 Reactor 模式即是 IO 多路复用模型的实现,通过 AIO 实现的 Proactor 模式即是异步 IO 模型的实现。

    Java 中传统的 IO 都是阻塞 IO,比如通过 socket 来读数据,调用 read 方法之后,如果数据没有就绪,当前线程就会一直阻塞在 read 方法调用那里,直到有数据才返回。因此在传统的网络服务设计模式中,比较经典的模式是多线程或线程池。当一条线程正在处理一个 client 的请求时,它是阻塞的状态,这时如果又来了一个 client 的请求,只好再启动一个新的线程去服务它,一个线程的阻塞不会影响其他线程工作。这种服务方式虽然看起来简便,但服务器为每个 client 都启动一个线程,资源消耗非常大。线程池的方式使得线程可以重复使用,在一定程度上减少了创建和销毁线程的系统开销。

    多线程(或线程池)模式适用于大部分的连接为短连接的情景。如果大部分的连接都为长连接,而同一时刻只有少数的连接中存在 IO 操作,那么为每一个连接安排一个线程的服务方式是非常浪费的。因此便出现了如下的高性能 IO 模型:采用 Reactor 模式的 Java NIO 模型,这也是 Reactive Programming 中最为重要的概念。
  • 高性能计数器

    今天在学习CAS的时候,想手写一个CAS的计数器,与JDK中的Atomic(AtomicLong,AtomicInteger等)系列的做个比较,本想性能应该能比JDK要差一丢丢,但却加了一个让线程让出时间片的代码,性能反而更高。
  • 阻塞队列

  • J.U.C 概览

    JSR,全称 Java Specification Requests,即 Java 规范提案,主要是用于向 JCP(Java Community Process)提出新增标准化技术规范的正式请求。每次 JAVA 版本更新都会有对应的 JSR 更新,比如在 Java 8 版本中,其新特性 Lambda 表达式对应的是 JSR 335,新的日期和时间 API 对应的是 JSR 310。当然,本文的关注点仅仅是 JSR 166,它是一个关于 Java 并发编程的规范提案,在 JDK 中,该规范由 java.util.concurrent 包实现,是在 JDK 5.0 的时候被引入的;另外 JDK6 引入 Deques、Navigable collections,对应的是 JSR 166x,JDK7 引入 fork-join 框架,用于并行执行任务,对应的是 JSR 166y。

    J.U.C. 即 java.util.concurrent 的缩写,该包参考自 EDU.oswego.cs.dl.util.concurrent,是 JSR 166 标准规范的一个实现;
  • 常用规约

  • Alibaba P3C

  • SpotBugs

  • Findbugs

  • Java 中执行命令

    在 Java 中执行系统命令,主要是使用 ProcessBuilder 和 Runtime.getRuntime().exec()。而在这里主要是介绍两种方法的使用。
  • RMI

    RMI:远程方法调用(Remote Method Invocation)。能够让在某个 java 虚拟机上的对象像调用本地对象一样调用另一个 java 虚拟机中的对象上的方法。
  • ModelMapper

    ModelMapper 是一个从对象到对象(object-to-object)的框架,能将 Java Bean(Pojo)对象从一种表现形式转化为另一种表现形式。它采用“通过约定来配置”的方式,自动匹配不同的对象映射,同时具备满足某些特殊需求的高级功能。这与.NET 的 AutoMapper 库很类似(但不是直接移植)。
  • Lombok 类属性

  • Lombok 数据对象