线程安全的容器
线程不安全的容器
HashMap
TreeMap
LinkedHashMap
Collections.synchronizedXXX Collections 类是一个工具类,该方法提供了大量对集合进行操作的方法,比如集合的排序、查找等操作。最重要的是,在它里面提供了几个静态工厂方法来创建同步容器类,如下:
123Map map = Collections.synchronizedMap(new HashMap<>());List list = Collections.synchronizedList(new ArrayList<>());Set set = Collections.synchronizedSet(new HashSet<>());
它的实现原理是在 Collections 类中添加==静态内部类==,静态内部类实现相应的接口,并在操作容器的方法中加入 synchronized 关键字
由于方法都是通过添加 sychronized 关键字来实现,因此并发行并不高,并不适合并发量较 ...
explain详解
我们常常用到 explain 这个命令查看一些 SQL 语句的查询计划,查看 SQL 语句是否使用上了索引、有没有做全表扫描,这些都可以使用 explain 命令来查看。
1234567mysql> explain select * from servers;+----+-------------+---------+------+---------------+------+---------+------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+---------+------+---------------+------+---------+------+------+-------+| 1 | SIMPLE | servers | ALL | NULL | NULL | NULL | NULL | 1 | NULL ...
HashMap源码解读
HashMap 数据结构图:HashMap 的数据结构是由数组和链表+红黑树组成。在进行增删查等才做的时候的时候会先定义到桶的位置,然后遍历桶的链表找到该元素。例如查询元素35,步骤如下:
定位到元素35所在的桶的位置:index = 35 % 16 = 3
在遍历3号桶找到该元素
由于 HashMap 的数组大小会动态改变,因此元素的桶的值可能会因为桶数组的改变而改变。
在JDK 1.8 中,HashMap 引入了红黑树,即 HashMap 的底层数据结构由原来的数组+链表变为数组+链表+红黑树。
# HashMap 源码分析查找12345678910111213141516171819202122232425262728public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value;}final Node<K,V> getNode(int hash, Object key) { ...
线程池
每当我们需要使用线程的时候,直接创建一个线程并不是一件很麻烦的事情,但是如果我们频繁的创建、销毁线程,系统的效率会大大降低。
Java 提供了线程池,使得我们的线程在执行完任务之后可以不被销毁,而是继续执行或等待其他任务。线程池能够大大简化并发编程
ThreadPoolExecutor 详解ThreadPoolExecutor 的完整构造方法签名:
1234567public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, ...