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

浙公网安备 33010602011771号