03 2021 档案

摘要:本文将从以下方面结合源码进行分析:自动扩容、初始化与懒加载、哈希计算、位运算(默认采用JDK1.8)。 自动扩容 扩容操作发生在putVal最后部分,在增加元素后才判断是否需要扩容,如果超过阈值,会自动扩容。 这里扩容都是<<1翻倍进行扩容的。 扩容时节点数组进行数据转移的三种情况: 节点的元素无后 阅读全文
posted @ 2021-03-31 00:01 凝冰物语 阅读(269) 评论(0) 推荐(1)
摘要:最近看hashmap源码时,发现给定初始capacity计算threshold的过程很巧妙。 1 static final int tableSizeFor(int cap) { 2 int n = cap - 1; 3 n |= n >>> 1; 4 n |= n >>> 2; 5 n |= n 阅读全文
posted @ 2021-03-30 09:51 凝冰物语 阅读(127) 评论(0) 推荐(0)
摘要:Description 给定一个矩形区域,每一个位置上都是1或0,求该矩阵中每一个位置上都是1的最大子矩形区域中的1的个数。 Input 输入第一行为测试用例个数。每一个用例有若干行,第一行为矩阵行数n和列数m,下面的n行每一行是用空格隔开的0或1。 Output 输出一个数值。 Sample In 阅读全文
posted @ 2021-03-22 22:31 凝冰物语 阅读(52) 评论(0) 推荐(0)
摘要:Description 给定两个字符串,返回两个字符串的最长公共子序列(不是最长公共子字符串),可能是多个。 Input 输入第一行为用例个数, 每个测试用例输入为两行,一行一个字符串 Output 如果没有公共子序列,不输出,如果有多个则分为多行,按字典序排序。 Sample Input 1 1 阅读全文
posted @ 2021-03-21 22:46 凝冰物语 阅读(69) 评论(0) 推荐(0)
摘要:原文链接:https://www.jianshu.com/p/00edb3d74a33 CAS是CPU的一条指令,其具有原子性,原子性是由CPU硬件层面保证的。 CAS原语有三个操作数——内存位置(V)、预期原值(A)、新值(B)。若内存位置与预期原值匹配则处理器将该位置更新为新值。否则不做操作。无 阅读全文
posted @ 2021-03-18 09:07 凝冰物语 阅读(414) 评论(0) 推荐(0)
摘要:CopyOnWriteSet 该容器与CopyOnWriteArrayList相似,也是读取时不加锁,任意线程可以读。写入时加锁创建一个新的容器,然后写入新元素。 内部用CopyOnWriteArrayList存储元素 private final CopyOnWriteArrayList<E> al 阅读全文
posted @ 2021-03-17 20:08 凝冰物语 阅读(608) 评论(0) 推荐(0)
摘要:并发容器一览 图源:https://time.geekbang.org/column/article/90201?utm_term=pc_interstitial_938 CopyOnWriteArrayList 该容器支持多个线程同时读(读不加锁),但同一时刻只能一个线程写(写加锁)。 内部维护了 阅读全文
posted @ 2021-03-17 14:11 凝冰物语 阅读(77) 评论(0) 推荐(0)
摘要:安全性: 数据竞争: 多个线程同时访问一个数据,并且至少有一个线程会写这个数据。 竞态条件: 程序的执行结果依赖程序执行的顺序。 也可以按照以下的方式理解竞态条件: 程序的执行依赖于某个状态变量,在判断满足条件的时候执行,但是在执行时其他变量同时修改了状态变量。 if (状态变量 满足 执行条件) 阅读全文
posted @ 2021-03-12 15:22 凝冰物语 阅读(174) 评论(0) 推荐(0)
摘要:产生死锁的四个必要条件: 1.互斥条件:一个资源同一时刻只能被一个线程所占有。 2.持有并等待条件:一个线程T1已经持有某资源X,然后申请获得新的资源Y,在等待过程中不释放已有资源X。 3.不可抢占条件:其它线程不能强行抢占线程T1的资源。 4.循环等待条件:线程T1持有资源X,等待线程T2持有的资 阅读全文
posted @ 2021-03-12 15:20 凝冰物语 阅读(2042) 评论(0) 推荐(0)
摘要:a happens-before b 翻译为a操作对b操作是可见的。可见即是指共享变量的更改能获知。 特性:传递性 原则:volatile定义的变量 写操作 happens-before 读操作 同一线程的代码顺序执行,先前的操作 happens-before 之后的操作 syncroized的解锁 阅读全文
posted @ 2021-03-12 15:16 凝冰物语 阅读(58) 评论(0) 推荐(0)
摘要:1.wait()方法 该方法继承于Object类。在调用obj.wait()方法后,当前线程会失去obj的锁。待其他线程调用obj.notify()或notifyAll()方法后进入锁等待池,争抢到锁后进行执行wait()后续代码。 wait(long time)方法超时自动结束阻塞,进入锁等待池, 阅读全文
posted @ 2021-03-12 15:07 凝冰物语 阅读(104) 评论(0) 推荐(0)
摘要:1.sleep()方法 jdk文档描述:Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to 阅读全文
posted @ 2021-03-12 14:58 凝冰物语 阅读(110) 评论(0) 推荐(0)
摘要:线程的创建方式 1.继承Thread类,重写run方法,示例如下: 1 class PrimeThread extends Thread { 2 long minPrime; 3 PrimeThread(long minPrime) { 4 this.minPrime = minPrime; 5 } 阅读全文
posted @ 2021-03-12 14:43 凝冰物语 阅读(104) 评论(0) 推荐(0)
摘要:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 进程(process)是执行程序的一次执行过程,是一个动态的概念。进程是资源分配的最小单位。 一个进程中可以包含若干个线程(thread),一个进程中至少包含一个线程,不然没有存在的意义。 线程是CPU调度和执行的最小单位。 阅读全文
posted @ 2021-03-12 14:33 凝冰物语 阅读(65) 评论(0) 推荐(0)