摘要: Java并发包中List只有一个实现类就是CopyOnWriteArrayList,它是线程安全的,运用了写时复制的策略,就是写的时候将共享变量复制一份出来,读的时候是无锁的。 所以CopyOnWriteArrayList只适用于写很少读很多的场景,而且能允许读写短暂的不一致。 下面是它的类图: 如 阅读全文
posted @ 2019-07-19 18:21 morphの 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 在之前volatile的文章中介绍过CPU缓存,它是用于解决计算机中主内存和CPU之间运行速度差的问题。在CPU缓存内部是按行存储的,所以每一行也被称作缓存行。缓存行是与内存进行数据交换的单位,大小一般是2的幂次数字节。 当CPU访问某个变量时,会先从缓存中读取,若没有就去内存中读取,然后将变量所在 阅读全文
posted @ 2019-07-16 18:24 morphの 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 模板方法模式的定义如下:定义一个操作中算法的框架,而将一些步骤的实现延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义某些算法的特定步骤。 而实际上我们经常使用这个模式或者用到过却没发现,比如Spring框架、并发包的队列同步器AQS等都用到了这个模式。 接下来举个例子说明一下,我想了半天最 阅读全文
posted @ 2019-07-11 11:53 morphの 阅读(103) 评论(0) 推荐(0) 编辑
摘要: 这三者都是java并发包的工具类,提供了比synchronized更加高级的各种同步结构,可以实现更加丰富的多线程操作。 Semaphore 信号量,我们应该都在操作系统课程里学过,它是解决进程间通信和同步的常用工具,也是一种常见的模型。信号量是一个确定的二元组(s, q), s是正整型变量,q是初 阅读全文
posted @ 2019-07-10 19:13 morphの 阅读(643) 评论(1) 推荐(0) 编辑
摘要: Lock是java.util.concurrent(java并发包)中的接口,用于解决线程安全问题。 既然synchronized可以解决线程同步问题为什么还会有lock? 这是因为使用synchronized申请资源的时候,如果资源被占有,那么线程就进入阻塞状态,而且无法主动释放资源。 而Lock 阅读全文
posted @ 2019-07-09 22:09 morphの 阅读(229) 评论(0) 推荐(0) 编辑
摘要: ThreadLocal的实例代表了一个线程局部的变量,只能在当前线程内被读写,不被其他线程共享。比如有两个线程同时执行一段相同的代码,而且这段代码又有一个指向同一个ThreadLocal变量的引用,但是这两个线程依然不能看到彼此的ThreadLocal变量。 简单的来说,它与普通变量的区别在于,每个 阅读全文
posted @ 2019-07-08 18:58 morphの 阅读(96) 评论(0) 推荐(0) 编辑
摘要: 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连 阅读全文
posted @ 2019-07-04 16:16 morphの 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 时间复杂度 执行效率是衡量算法优劣的一个重要指标,一般来说我们把代码运行一遍就能得到算法执行的时间和占用的内存大小,但这其实很不准确,结果既依赖于运行环境硬件设备又被测试规模影响。 所以我们需要一种分析方法去计算算法的运行效率,这就是大O复杂度表示法,比如我们经常看见O(n)之类的。 举个简单例子, 阅读全文
posted @ 2019-07-04 15:37 morphの 阅读(469) 评论(0) 推荐(0) 编辑
摘要: 简单的说死锁就是一组互相竞争资源的线程因互相等待,导致永久阻塞的现象。 先举个例子演示死锁: public class DeadLock { private static final Object a = new Object(); private static final Object b = n 阅读全文
posted @ 2019-07-03 20:47 morphの 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 首先讲一下原子性以及互斥。 举个例子,在32位CPU上执行long(64位)变量的写操作时,会存在多线程下读写不一致的问题。 因为32位CPU下对其写会拆分成两次操作,一次写高32位和一次写底32位,而这个操作无法保证其原子性所以产生并发问题了。 原子性 指即一个操作或者多个操作,要么全部执行并且执 阅读全文
posted @ 2019-07-02 22:41 morphの 阅读(322) 评论(0) 推荐(0) 编辑