Java/J.U.C(java.util.concurrent)包的梳理

Java/J.U.C(java.util.concurrent)包的梳理

java.util.concurrent提供了并发编程的解决方案,主要包括两大块: - CAS:是java.util.concurrent.atomic包的基础 - AQS:是java.util.concurrent.locks包以及一些常用类(比如 Semophore、ReentrantLock)的基础

J.U.C 包的分类: - 线程执行器:executor - 锁:locks

阅读更多
Java/Java 集合框架

Java/Java 集合框架

数据结构常见考点

  • 数组和链表的区别
  • 链表的操作:如反转、链表环路检测、双向链表、循环链表以及相关操作
  • 队列、栈的应用
  • 二叉树的遍历以及其递归和非递归的实现
  • 红黑树的旋转
阅读更多
Java/Java异常体系

Java/Java异常体系

Java 从诞生之初就提供了完善的异常处理机制,大大降低了编写和维护可靠程序的门槛。Java 的异常处理机制主要回答了 3 个问题: - What:异常类型回答了什么被抛出 - Where:异常堆栈跟踪回答了在哪里被抛出 - Why:异常信息回答了为什么被抛出

Java异常体系类图
阅读更多
Java/Java 线程池

Java/Java 线程池

在 Java 中,一般都会利用 Executors 创建不同的线程池满足不同场景的需求。

1
Executors.newFixedThreadPool(int nThreads)

指定工作线程数量的线程池,每来一个任务,就创建一个工作线程,如果线程数打到了nThreads,就把任务存放进队列中排队,

1
Executors.newCachedThreadPool()

处理大量短时间工作任务的线程

阅读更多
Java/深入理解 CAS

Java/深入理解 CAS

Java 中的synchronized是一种悲观锁,悲观锁始终假设会发生并发冲突,因此会阻止一切可能违反数据完整性的操作。而 CAS 是一种乐观锁 CAS 全称是 Compare and Swap。乐观锁假设不会发生并发冲突,因此只在提交的时候检查是否违反数据完整性,如果提交失败则会进行重试。

CAS 支持原子更新操作,适用于计数器,序列发生器等场景。CAS 操作失败时由开发者决定是继续尝试,还是执行别的操作。

阅读更多
Java/Java 内存模型 JMM 与 volatile

Java/Java 内存模型 JMM 与 volatile

Java 内存模型(Java Memory Model,简称 JMM)是一种抽象的概念,并不真实存在,它描述的是一组规范或者规则,通过这种规范定义了程序中各个变量(包括实例字段、静态字段和构成数组对象的元素)的访问方式。

阅读更多
Java/Java的IO机制

Java/Java的IO机制

BIO、NIO、AIO 的区别

BIO

包括基于字节流的 InputStream 和 OutputStream,以及基于字符流的 Reader 和Writer。 ## NIO NonBlock-IO:构建多路复用的、同步非阻塞的 IO 操作 - Channels 其中 FileChannels 有 transferTo 和 transferFrom 两个方法,适合大文件的拷贝,避免了两次用户态和内核态的上下文切换,即"零拷贝",效率高

阅读更多
Java/synchronized 和 ReentrantLock

Java/synchronized 和 ReentrantLock

在 Java5 之前,只有synchronized一种锁,在 Java5 之后,增加了ReentrantLockReentrantLock位于 java.util.concurrent.locks 包,和 CountDownLatch、FutureTask、Semaphore 一样基于 AQS 实现,能够实现比synchronized更细粒度的控制,如控制公平性(fairness)。使用ReentrantLock需要注意的是在调用 lock() 方法之后,必须调用 unlock() 释放锁。在 Java6 后经过优化的synchronized性能未必比ReentrantLock低,并且synchronized也是可重入的。

阅读更多
Java/Java 中的 synchronized 关键字

Java/Java 中的 synchronized 关键字

synchronized 关键字是为了解决线程安全问题的。我们先来了解下解决线程安全问题的主要诱因。线程安全问题的主要诱因有两点: - 存在共享数据(也称为临界资源) - 存在多条线程共同操作这些共享数据

要解决线程安全问题,只有一个办法:保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等待该线程处理完数据后再对共享数据进行操作。

阅读更多
Java/如何中断线程

Java/如何中断线程

先来说以下已经被抛弃的用于中断线程的方法: - 通过调用stop()方法停止线程 这种方法是不安全的。比如线程 A 调用线程 B 的stop()方法去停止 B 线程,但是 线程 A 是不知道线程 B 的执行情况的,这种突然的停止会导致线程 B 的一些清理工作还没完成就被强制停止了,而且线程 B 会立刻释放所占有的锁,这有可能会引发数据不同步的问题

阅读更多