随笔分类 -  JAVA多线程

摘要:Java并发包中List只有一个实现类就是CopyOnWriteArrayList,它是线程安全的,运用了写时复制的策略,就是写的时候将共享变量复制一份出来,读的时候是无锁的。 所以CopyOnWriteArrayList只适用于写很少读很多的场景,而且能允许读写短暂的不一致。 下面是它的类图: 如 阅读全文
posted @ 2019-07-19 18:21 morphの 阅读(126) 评论(0) 推荐(0)
摘要:在之前volatile的文章中介绍过CPU缓存,它是用于解决计算机中主内存和CPU之间运行速度差的问题。在CPU缓存内部是按行存储的,所以每一行也被称作缓存行。缓存行是与内存进行数据交换的单位,大小一般是2的幂次数字节。 当CPU访问某个变量时,会先从缓存中读取,若没有就去内存中读取,然后将变量所在 阅读全文
posted @ 2019-07-16 18:24 morphの 阅读(180) 评论(0) 推荐(0)
摘要:这三者都是java并发包的工具类,提供了比synchronized更加高级的各种同步结构,可以实现更加丰富的多线程操作。 Semaphore 信号量,我们应该都在操作系统课程里学过,它是解决进程间通信和同步的常用工具,也是一种常见的模型。信号量是一个确定的二元组(s, q), s是正整型变量,q是初 阅读全文
posted @ 2019-07-10 19:13 morphの 阅读(651) 评论(1) 推荐(0)
摘要:Lock是java.util.concurrent(java并发包)中的接口,用于解决线程安全问题。 既然synchronized可以解决线程同步问题为什么还会有lock? 这是因为使用synchronized申请资源的时候,如果资源被占有,那么线程就进入阻塞状态,而且无法主动释放资源。 而Lock 阅读全文
posted @ 2019-07-09 22:09 morphの 阅读(267) 评论(0) 推荐(0)
摘要:ThreadLocal的实例代表了一个线程局部的变量,只能在当前线程内被读写,不被其他线程共享。比如有两个线程同时执行一段相同的代码,而且这段代码又有一个指向同一个ThreadLocal变量的引用,但是这两个线程依然不能看到彼此的ThreadLocal变量。 简单的来说,它与普通变量的区别在于,每个 阅读全文
posted @ 2019-07-08 18:58 morphの 阅读(112) 评论(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の 阅读(152) 评论(0) 推荐(0)
摘要:首先讲一下原子性以及互斥。 举个例子,在32位CPU上执行long(64位)变量的写操作时,会存在多线程下读写不一致的问题。 因为32位CPU下对其写会拆分成两次操作,一次写高32位和一次写底32位,而这个操作无法保证其原子性所以产生并发问题了。 原子性 指即一个操作或者多个操作,要么全部执行并且执 阅读全文
posted @ 2019-07-02 22:41 morphの 阅读(331) 评论(0) 推荐(0)
摘要:我们应该都知道volatile关键字的作用是保证变量在多线程之间的可见性以及有序性。 普通的共享变量不能保证可见性的原因是缓存,首先了解一下CPU缓存: CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为显而易见CPU运算速度要比内存读写速度快得多,这种访问速度的显著差异导 阅读全文
posted @ 2019-06-28 17:26 morphの 阅读(216) 评论(0) 推荐(0)