随笔分类 - JavaSE
摘要:一些数据结构的操作性能 数组:查找快,新增、删除慢 采用一段连续的存储单元来存储数据 指定下标的查找,时间复杂度为 O(1) 通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n)。当然,对于有序数组,可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为
阅读全文
摘要:ThreadLocal 实例通常都是 static 类型,用于关联线程和线程上下文。 ThreadLocal 提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。 总结: 线程并发: 在多线程并发的场景下 传
阅读全文
摘要:AbstractQueuedSynchronizer 为 java.util.concurrent.locks 包下的一个抽象类,简称 AQS(抽象队列同步器)。 并发包(JUC)中的 ReentrantLock、Semaphore、ReentrantReadWriteLock、Synchronou
阅读全文
摘要:对集合中的对象进行排序 1.Comparator 外部比较器,需要外部创建比较器对象实现 Comparator 接口 /** * 外部比较器 * 按age由小到大排序 */ class UserComparators implements Comparator<User>{ @Override pu
阅读全文
摘要:这三个都是自 JDK1.5 开始加入到 java.util.concurrent.atomic 下面的。他们都可以在 lock-free 的情况下以原子的方式更新对象引用。 一、AtomicReference 以原子方式更新对象引用。 static class User { private int
阅读全文
摘要:CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术。 CAS 的思想很简单:三个参数,一个当前内存值 V、旧的预期值 A、即将更新的值 B,当且仅当预期值 A 和内存值 V 相同时,将内存值修改为 B 并返回 true,否则什么都不做,并返回 false。 和
阅读全文
摘要:LockSupport 和 CAS 是 Java 并发包中很多并发工具控制机制的基础,它们底层其实都是依赖 Unsafe 实现。 LockSupport 提供 park() 和 unpark() 方法实现阻塞线程和解除线程阻塞。 每个使用 LockSupport 的线程都会与一个许可(permit)
阅读全文
摘要:关于阻塞与非阻塞:https://www.cnblogs.com/jhxxb/p/11272727.html 一、传统的 IO 流都是阻塞式的 当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。 因此,在网络通信进行 IO
阅读全文
摘要:NIO:一种同步非阻塞(没有被 IO 阻塞,但是被 select/poll/epoll 阻塞)的 I/O 模型,操作系统内核的 I/O 多路复用模型是 Java NIO 的基础。 https://segmentfault.com/a/1190000003063859 一、Buffer(缓冲区) 在
阅读全文
摘要:机械硬盘硬件结构(了解)https://diy.pconline.com.cn/cpu/study_cpu/1009/2215404_all.html 一、数据储存单位 1.bit(位) 计算机数据在硬盘中,以机械硬盘为例,其内部由磁性材料制成。磁极有 N\S 两级,可表示两种状态。可以看成 0/1
阅读全文
摘要:Java 中 的 IO 操作就是对字型节或字符型数据的读写。 一、IO 分类 1.按流的方向分类 输入流(InputStream、Reader):只能进行读操作。 输出流(OutputStream、Writer):只能进行写操作。 2.按流的类型分类 字节流(InputStream、OutputSt
阅读全文
摘要:一、Lambad @FunctionalInterface interface Calculator { int add(int a, int b); default int add(long a, int b) { return (int) a + b; } } public static voi
阅读全文
摘要:一、 使用 while(true) 和 sleep 实现 new Thread(){ @Override public void run() { while (true) { System.out.println("Hello!"); try { Thread.sleep(1000); } catc
阅读全文
摘要:一、sleep() 与 wait() 两者都会让当前线程进入等待状态。唤醒后都需要等待 CPU 资源,不一定会立即执行。若在等待期间被调用此线程的的 interrupt() 方法,将会产生 InterruptedException 异常。 wait() 是 Object 类的方法,会释放对象锁,并让
阅读全文
摘要:一、Serializable 要序列化对象需要实现 Serializable 接口 // lombok 插件,省去 get,set 方法,构造器方法 @Data @AllArgsConstructor public class Person implements Serializable { pri
阅读全文
摘要:通常,创建线程的执行单元有两种,一种是直接继承 Thread,另外一种就是实现 Runnable 接口。 但这两种都有一个问题就是无法有返回值,且子线程在执行过程中无法抛出异常。想线程有返回值,可以使用 Callable 来创建执行单元。 Runnable 一个接口,没有返回值 @Functiona
阅读全文
摘要:一、创建线程池 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html https://docs.oracle.com/en/java/javase/21/docs/api/java
阅读全文
摘要:在看 ThreadPoolExecutor 源码时看到这么一段代码 retry: for (;;) { int c = ctl.get(); int rs = runStateOf(c); // Check if queue empty only if necessary. if (rs >= SH
阅读全文
摘要:Oracle JDK 定义中,线程一共有六种状态 https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html NEW:未启动状态 Thread t = new Thread() { @Override public vo
阅读全文
摘要:一、进程与线程的概念 进程和线程都是一个CPU工作时间段的描述,只是关注点不同。 进程(Process): 资源(CPU,内存等,文件,网络等)分配的基本单位。系统中有很多进程,它们都会使用内存。为了确保内存不被其他进程使用,每个进程所能访问的内存都是分配好的,不能互相干扰。 线程(Thread):
阅读全文