继承关系图
进程池的几种常用创建类型通过ThreadPoolExecutor构造函数创建12345public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, Blocking ...
Java
未读死锁产生条件死锁产生有四大必要条件,只要不满足其中一种即可避免死锁
互斥条件: 资源是独占的,一次只能被一个线程使用。
请求与保持条件: 线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源被其他线程占有。
不剥夺条件: 线程已获得的资源在未使用完之前,不能被强行剥夺。
循环等待条件: 若干线程之间形成一种头尾相接的循环等待资源关系。(例如线程A持有资源1,需要资源2;线程B持有资源2,需要资源3;线程C持有资源3,需要资源1)
几种常见死锁示例嵌套锁死锁嵌套锁死锁在一个线程试图以不同顺序获取多个锁可能发生,例如:
线程A获取锁1,然后尝试获取锁2
线程B获取锁2,然后尝试获取锁1
示例代码
123456789101112131415161718192021222324252627282930313233343536373839public class NestedLockDeadlock { private static final Object lock1 = new Object(); private static final Object ...
Java
未读概念进程:指程序的一次执行过程,是系统资源分配的基本单位。每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据。操作系统负责进程控制和资源分配等工作。
线程:进程内部的一个执行单元,是操作系统能够进行运算调度的最小单位,一个进程可以包含多个线程。
对比
进程
线程
占用
相互独立,内存占用较大,每个进程运行一个独立jvm
虚拟机栈,本地方法栈,程序计数器独立,共享堆与元数据内存
通信
IPC机制(套接字,管道等)
可直接通过共享内存通信
健壮性
进程是资源分配的基本单位, 进程的崩溃只会影响当前进程及其子进程, 不会对系统其他进程造成影响
线程是程序执行的基本单位,一个线程崩溃可能会导致整个进程崩溃
总结进程为一个程序一次执行的过程,线程为程序中的一个执行单元,一个进程可以包含多个线程,线程的性能开销较小且线程间方便相互通信,但从健壮性来看线程出错会对整个进程造成较大影响(chromium的多进程框架的主要目的之一就是提高应用健壮性)
Java
未读前言因为尝试用Java敲Python题遇到字典排序问题而写
Java Map与Python dict的区别
Java TreeMap
Java HashMap
Python dict
实现原理
使用红黑树
使用哈希表
哈希表
键类型
必须同类型
必须同类型,需要提供Comparator或key实现Comparable接口
可不同类型,通过地址比较
有序性
无序
默认Key升序排序
3.6以前无序,3.6及以后有序
平均查询时间复杂度
O(logn)
O(1)
O(1)
null键
不允许
允许
允许
Java Map遍历Map遍历可以用迭代器遍历或者列表遍历,前者速度更快但只能遍历一次,若需要再次遍历只能重新定义是个iterator对象,若需要重复遍历则后则效率更高
迭代器遍历用Map.entrySet().iterator()将Map元素以Entry键值对的形式生成迭代器
1234567891011public static <K,V> void traversal1(Map<K, V> map) { Itera ...
