002-数据结构与算法-复杂度分析

什么是复杂度分析

数据结构和算法的最终目的,是让代码执行速度更快,占用空间更省。

而复杂度分析就是用来衡量代码是否够快,是否够省的指标。

复杂度分析包括时间复杂度(快)和空间复杂度(省)两个方面。

点我阅读更多...

001-Java基础-IO

基本概念

  • 同步与异步。同步是一种可靠的有序运行机制,当我们进行同步操作时,后续任务需要等到当前调用返回,才会进行下一步。而异步则不需要等待当前调用返回,通常依赖事件、回调等机制实现。
  • 阻塞与非阻塞。在进行阻塞操作时,当前线程会一直等待IO操作完成,无法进行其它任务,直到某个条件就绪才继续。非阻塞则是不管IO操作是否完成,直接返回,相应操作在后台继续处理。
点我阅读更多...

001-Java基础-volatile关键字

Java内存模型

  • 所有变量都保存在主内存中
  • 每个线程都有自己独立的工作内存
  • 线程对变量的操作(读/写)都必须在工作内存中

例如下面的代码

int i = 10; 

java中,必须先在工作内存中更新变量i,然后再刷新到主内存,而不是直接刷新到主内存。

点我阅读更多...

001-Java基础-CAS

什么是CAS

CAS全称compare-and-swap(比较并交换),是一系列操作的集合,包括:

  • 获取当前值
  • 进行一些运算
  • 利用CAS指令进行更新。如果当前值未变,则更新成功;否则更新失败或者进行重试。

CAS出现的目的是为了在多线程编程中实现不被打断的数据操作,从而避免由于多线程操作同一数据导致的数据不一致问题。

Syncrhonized、ReentrantLock可以看做是悲观锁,而CAS则是乐观锁。

点我阅读更多...

001-Java基础-锁

锁是Java并发的基础,对于锁我们需要了解以下四个方面:

  • 理解什么是线程安全。
  • 理解最常用的锁Syncronized和ReentrantLock基本的使用方法。
  • 掌握Syncronized和ReentrantLock底层的实现逻辑。
  • Java类库的其它锁。
点我阅读更多...

001-Java基础-并发包(线程池)

常用线程池的创建方法

使用java.util.concurrent.Excutors类,常用的几种静态方法。

  • newCachedThreadPool()。短时间缓存线程并重用,适合处理大量短时间工作任务。
  • newFixedThreadPool()。线程数量固定的线程池。
  • newSingleThreadExecutor()。只有1个线程的线程池。
  • newScheduledThreadExecutor()。具备周期调度功能的线程池。
点我阅读更多...