Skip to content

Instantly share code, notes, and snippets.

View simonwoo's full-sized avatar
💭
I may be slow to respond.

Chong WU simonwoo

💭
I may be slow to respond.
View GitHub Profile

如何构建一个NIO服务器

BIO服务器

非阻塞IO pipelines

非阻塞IO pipelines是一组处理非阻塞IO的链式组件,它包括以一种非阻塞的方式读和写IO。

non-blocking IO

组件使用Selector来检查何时一个Channel有数据可以读取。然后该组件读取输入数据并生成一些输出数据,这些输出数据被写入Channel。 非阻塞IO pipelines有时候会超过一个组件来处理数据,它的长度根据它的用处。一个非阻塞IO pipelines有时可以同时读取多个Channels。

基础

  • 核心概念
    • 对象模型
    • 接口设计
  • 类库
    • lang(String)
    • collections
    • concurrent
    • io
“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。
1.同步与异步
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果。
而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。
典型的异步编程模型比如Node.js

Java线程与操作系统中轻量级进程是一一对应的关系。 为了实现并发,可以创建多个线程,如何管理这些线程,可使用线程池的方式。 当多个线程对同一资源进行访问时,可能会出现不一致的情况, 为了防止这种情况的发生可以使用锁的方式,或者当该资源是原子类时,也能保证同一时刻只有一个线程访问该资源。

Java内存模型是围绕着并发过程中如何处理原子性、可见性、有序性这三个特征来建立的:

Java Enum is a type like class and interface and can be used to define a set of Enum constants. Enum constants are implicitly static and final and you can not change their value once created. Enum in Java provides type-safety and can be used inside switch statement like int variables.

Benefits:

  • Enum is type-safe you can not assign anything else other than predefined Enum constants to an Enum variable. It is a compiler error to assign something else, unlike the public static final variables used in Enum int pattern and Enum String pattern.
  • Enum has its own namespace.
  • The best feature of Enum is you can use Enum in Java inside Switch statement like int or char primitive data type. We will also see an example of using java enum in switch statement in this java enum tutorial.
  • Adding new constants on Enum in Java is easy and you can add new constants without breaking the existing code.

公司的dev团队有些类似固定数目线程池,每个开发人员相当于其中的一个线程:

  • 当有新的ticket产生时,从线程池中抽出一个线程,执行任务
  • 当所有的线程都处于忙的状态时,ticket就被打入到等待队列,直到线程池中的线程出现空闲为止

ps:

  • 这个假设基于dev团队的每个开发人员对前后端开发都比较精通的情况下,否则,当把ticket提交给一个线程时,则无法执行
  • 提高线程池效率最直接的方法就是增加线程的数量,例如招聘新的开发人员,但是这也许有可能带来一些副作用, 当任务比较充足时,每个线程都处于忙态。但是一旦ticket的数量不足时,会造成线程的空闲

400 Bad Request

The request could not be understood by the server due to malformed syntax. For example, Let's say I have a ending point that allows POST'ing purchases in JSON format. It looks like this:

{
    "account_number": 45645511
    "upc": "00490000486"
    "price": 1.00
    "tax": 0.08
}

目的

使使用者不需要把自己的帳號密碼給予第三方服務也可以使用服務提供者的API。

应用场景

我想将储存在google driver上的照片使用一家网络冲洗照片公司 - 云照片冲洗出来。但是云照片没有访问我的google driver的权利。 为了使它能够访问,我必须对其进行授权。如何获取授权?最简单的方式就是告诉云冲洗我的google账户和密码,但是这种方式会有潜在的风险。 OAuth2就是为了解决授权问题而生。

无论js是内嵌还是在外链文件中,页面下载和渲染都必须停下来等脚本执行完。js执行过程消耗时间越长,浏览器等用户输入的时间就越长。 浏览器在下载和执行脚本时出现阻塞的原因在于,脚本可能改变页面或者js的命名空间。

脚本位置

<html>
<head>
    <title>Source Example</title>
 

一个Promise对象代表一个目前还不可用,但是在未来的某个时间点可以被解析的值。它允许你以一种同步的方式编写异步代码。

Promise有三种状态:

  • pending(没有fulfilled或者rejected)
  • fulfilled
  • rejected

Promise的一种实现方式: