09 2020 档案
摘要:对于semaphore实际是提供了单机版的令牌机制,且对于等待获取令牌的线程提供了公平和非公平两种方式; public static void main(String[] args) { final int MAX_VALUE = 5; ExecutorService executorService
阅读全文
摘要:CountDownLatch 和 CyclicBarrier对比 两者都能起到计数器的作用; 不同点在于 构造方法,对于两者的构造方法都支持输入计数器的初始化值,而CyclicBarrier则还支持设置当计数器归零的回调事件 await方法,对于CountDownLatch一般是主线程使用阻塞等待所
阅读全文
摘要:public static void main(String[] args) throws InterruptedException { // 创建新的线程,但此时并未创建一个真正的线程 Thread thread = new Thread(() -> { Thread currentThread
阅读全文
摘要:使用lua 实现cas操作 @Bean(name = "customStringRedisTemplate")public RedisTemplate<String, String> customStringRedisTemplate(RedisConnectionFactory factory)
阅读全文
摘要:对于"StampedLock"提供了三种锁模式 读锁-互斥 写锁-共享 优势读锁 对于读锁和优势读锁的区别在于,对于读锁是利用cas操作变更状态,但存在一定的几率出现读等待的情况,而对于优势读操作,只需要简单的位运算操作,如果在排他锁持有情况下,这直接返回0,反之则返回非0版本号数据; 相对而言优势
阅读全文
摘要:对于"ReentrantReadWriteLock" 和reentrantLock的比较 相同点:由于ReentrantReadWriteLock继承至ReentrantLock,因此拥有相同的操作 不同点 提供了读锁和写锁两种不同的锁 读锁:shared 写锁:exclusive 锁降级 在写锁加
阅读全文
摘要:使用原子自增和 expire 搭配实现原子操作 @Bean(name = "customStringRedisTemplate") public RedisTemplate<String, String> customStringRedisTemplate(RedisConnectionFactor
阅读全文
摘要:ReentrantLock vs synchronized 相同点 可重入 互斥锁 隐性monitor:对synchronized是利用object对象头实现监控操作; 而对于Lock利用newCondition提供的Condition实现 对于monitor的作用主要是为了实现线程通讯 不同点 支
阅读全文
摘要:锁定的对象: 对象(Object) 和 类(Class) 对于jvm而言,实际锁定的是Object还是Class 是没有区别的,原因在于Class实际也是一个Object,唯一的不同点在于, Object对象是存在于Heap中,而Class是存在于MetaData(java8+)中; 对于这两种竞态
阅读全文
摘要:https://en.wikipedia.org/wiki/Merge_sort 合并排序 原理:利用于分治和递归的思想,首先将数据拆分为最小单位,然后从最小单位开始合并排序操作,将小分区逐步合并为最大的分区; 对于合并排序由于在合并操作过程中需要额外的内存空间,因此不属于原地排序算法 稳定性:在合
阅读全文
摘要:https://en.wikipedia.org/wiki/Quicksort 快速排序 原理:通过中位值(pivot)进行比较来进行不断分区,直到所有的区间达到最小(容量为1)时,此时结果就是有序的; 在执行对比操作时是从低位到高位的对比操作,通过不断摘除中间值的方式来实现排序 快速排序所有的移动
阅读全文
摘要:https://en.wikipedia.org/wiki/Insertion_sort 对于插入排序 原理:从低位到高位执行遍历操作,遍历到的元素作为对比元素存在;对于对比操作,实际是通过高位到低位,将比较元素和[0,比较元素所在索引-1]区间的数据进行对比操作以及交换(移动)操作; 对于移动操作
阅读全文
摘要:https://en.wikipedia.org/wiki/Bubble_sort 原理:从低位到高位的对比排序;通过compare和 swap达到排序的目的 对于冒泡排序由于其并不需要额外的内存空间,只需要原数组就可以达到排序的目的,不需要额外的内存空间,因此属于原地排序 稳定性分析 从低位到高位
阅读全文
摘要:public static void main(String[] args) { List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4)); // 常规删除 // list.removeIf(next -> next == 3);
阅读全文
摘要:当类并没有重写Object#hashCode()时, 对于 System.identityHashCode(Object) 和 Object#hashCode() 的结果是一致的; 但对于类似String这些重写了Object#hashCode()的类时,当直接调用hashCode()时,由于重载的
阅读全文
摘要:Question: 如果一个类覆盖了Obejct 的 equals(Object) 方法,需要覆盖hashCode()方法吗? A: 不强制覆盖, WARNING: 对于覆盖的equals中不要使用hashCode()方法; 对于hashCode方法实际都是计算比较重的方法;而equals方法一般都
阅读全文
摘要:对于java 泛型 编译时处理,运行时擦除的特点理解 对于编译时处理 在使用泛型相关的类或方法时,如果声明时的类型和具体使用时的类型不一致则直接会编译不通过 对于运行时擦除 当在运行时对两个相同类型但泛型的具体类型不同时,在运行时实际都是操作的相同的类型,而不会体现出来泛型的的具体类型; publi
阅读全文
摘要:在Collections存在相关"Synchronized"支持同步的集合, 在java1.0 也存在"Vector"; 为什么会选择放弃"Vector"而使用"SynchronizedRandomList"? 对于这两者而言,虽然都使用了synchronized 关键字但其作用范围是不同的 对于V
阅读全文
摘要:三目运算以及自动拆箱导致的NPE System.out.println(false ? 1 : (Long)null); // NPE System.out.println(false ? Long.valueOf(1L) : (Long)null); System.out.println(fals
阅读全文
摘要:对于所有的基本类型都是浅拷贝,不论什么方式; 但对于引用类型,当调用object的clone方法时,除String类型外,其他都为深拷贝;对于String对象类型要实现深拷贝必须要手动创建(new)一个新的String对象; public class CloneAbleDemo { public s
阅读全文
摘要:协程数据传递问题 func TestGoroutineData(t *testing.T) { var wg sync.WaitGroup wg.Add(1) i := 0 go func(j int) { t.Log("异步协程执行") assert.Equal(t,0,j) assert.Equ
阅读全文

浙公网安备 33010602011771号