
JUC多线程
多线程相关的基础知识
blueskygotohz
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
MESI--CPU缓存一致性协议浅谈
CPU为何要有高速缓存现代处理器为了提高访问数据的效率,在每个CPU核心上都会有多级容量小,速度快的缓存(分别称之为L1 cache,L2 cache,多核心共享L3 cache等),用于缓存常用的数据。由于内存的速度要比CPU慢将近100倍,数据被修改时也只是先更新cache,并不是直接写回到主存中(CPU是不能直接跟内存进行通信的,CPU只对接cache,然后由cache对接主存),这样一来就造成了缓存中的数据与内存不一致。如果系统是单核处理器,所有线程看到的都是缓存中的最新数据,当然没有问题。但如原创 2020-06-20 15:33:29 · 423 阅读 · 0 评论 -
面试题:要求用线程顺序打印A1B2C3....Z26
1 用synchronized+wait()+notify()实现public class T_Sync_wait_notify {public static void main(String[] args) {final Object o = new Object();char[] aI = "1234567".toCharArray();char[] aC = "ABCDEFG".toCharArray(...原创 2020-06-16 19:52:26 · 416 阅读 · 0 评论 -
常见的Queue介绍
queue常用方法:remove:从队列中删除第一个元素,不存在报错。poll:从队列中删除第一个元素,不存在返回null。peek:查询第一个元素,不存在返回null。add:往队列加一个元素,队列满报异常。offer:往队列加一个元素,队列满返回false;put: 往队列加一个元素,队列满时阻塞,直到队列有新的空间。take:从队列中拿取第一个元素,队列为空则阻塞到队列有元素为止。PriorityQueue,即优先队列。优先队列的作用是能...原创 2020-06-16 17:33:02 · 2484 阅读 · 0 评论 -
CopyOnWriteArrayList简单认识
1、ArrayList非线程安全的缺陷说到这个容器,从名字就可以看出,不得不说另外一个容器,也就是ArrayList。ArrayList是非线程安全的,也就是说在多个线程下进行读写,会出现异常。先举一个简单的例子,看看会出现什么问题100个线程,每个线程都往集合里面添加1000个数据public class T_CopyOnWriteList {public static void main(String[] args) {List<...原创 2020-06-16 16:51:48 · 420 阅读 · 0 评论 -
模拟火车票买票案例
有N张火车票,每张票都有一个编号,同时有10个窗口对外售票,请写一个模拟程序1 用ArrayList实现public class TicketSeller1 {static List<String> tickets = new ArrayList<>();static {SortedMap s = new TreeMap();for (int i = 0; i < 100...原创 2020-06-15 17:47:25 · 1257 阅读 · 0 评论 -
Hashtable、HashMap、Collections.synchronizedMap()、ConcurrentHashMap 读写性能比较
1 写性能,100万个数据,开启100个线程去写1.1 Hashtablepublic class T_Hashtable {static Hashtable<UUID, UUID> m = new Hashtable<>();static int count = Constants.COUNT;static UUID[] keys = new UUID[count];static UUID[...原创 2020-06-15 17:22:12 · 871 阅读 · 0 评论 -
常见集合容器类简单总结
1 常见集合类,容器汇总如下:1 collection集合类List 列表,有序,可重复Queue 队列,有序,可重复Set 集合,不可重复 List Vector ,比较早的集合类了,是JDK1.0版本添加的类,他继承于AbstractList,实现了接口库List,RandomAccess,和Cloneable。Vector实现了List,所以它能够为队列提供:增加,删除,修改,遍历等操作。Vector实现RandomAccess接口,他使队列能够快速访..原创 2020-06-15 16:20:33 · 1251 阅读 · 0 评论 -
ReentrantLock实现原理及源码分析
ReentrantLock是基于AQS的,AQS是Java并发包中众多同步组件的构建基础,它通过一个int类型的状态变量state和一个FIFO队列来完成共享资源的获取,线程的排队等待等。AQS是个底层框架,采用模板方法模式,它定义了通用的较为复杂的逻辑骨架,比如线程的排队,阻塞,唤醒等,将这些复杂但实质通用的部分抽取出来,这些都是需要构建同步组件的使用者无需关心的,使用者仅需重写一些简单的指定的方法即可(其实就是对于共享变量state的一些简单的获取释放的操作)。公平锁内部是FairSync,非公转载 2020-06-11 20:50:53 · 311 阅读 · 0 评论 -
JAVA四种引用介绍
1 强引用Object o = new Object(); // o就是强引用最普遍的一种引用方式,如String s = "abc",变量s就是字符串“abc”的强引用,强引用不会被GC回收,并且在java.lang.ref中也没有实际的对应类型。如果一个对象具有强引用,就以为着必不可少,垃圾回收器不会回收它。```当内存不足时java虚拟机宁可抛出OOM错误,使程序终止,也不会随时回收强引用对象```。2 软引用(SoftReference)软引用是用来描述一些还有用但并非必须的对象..原创 2020-06-11 17:55:20 · 229 阅读 · 0 评论 -
聊聊volatile
聊聊volatile内存模型的相关概念大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。也就是,当程序在运行过程中,会将运算需要的数据从主存复制一.转载 2020-06-04 17:27:09 · 217 阅读 · 0 评论 -
synchronized的加锁方式与锁的升级过程
synchronized的特性原子性所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。但是像i++、i+=1等操作字符就不是原子性的,它们是分成读取、计算、赋值几步操作,原值在这些步骤还没完成时就可能已经被赋值了,那么最后赋值写入的数据就是脏数据,无法保证原子性。被synchronized修饰的类或对象的所有操作都是原子的,因...原创 2020-06-04 09:47:04 · 554 阅读 · 0 评论 -
浅谈Java的线程状态
Java中线程的状态分为6种,分别如下:1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。3.阻塞(BL.原创 2020-06-02 21:05:31 · 210 阅读 · 0 评论 -
ThreadLocal简单介绍
ThreadLocal是什么?ThreadLocal提供线程本地变量,每个线程拥有本地变量的副本,各个线程之间的变量互不干扰。ThreadLocal实现在多线程环境下去保证变量的安全。以下来源于ThreadLocal类的注释。This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (vi原创 2020-06-11 09:28:56 · 258 阅读 · 0 评论 -
面试题:写一个固定容量同步容器,拥有put和get方法, 能够支持2个生产者线程以及10个消费者线程的阻塞调用
1 用synchronized+wait()+notifyAll实现思路:当生产者达到最大数量的时候,让生产者线程wait阻塞等待,否则继续生产,同时通知消费者进行消费。 当消费者消费到0个的时候,让消费者线程wait阻塞等待,否则继续消费,同时通知生产者进行生产。public class Container1<T> { final private LinkedList<T> lists = new LinkedList<T>(...原创 2020-06-10 09:26:29 · 459 阅读 · 1 评论 -
浅谈CAS
为什么需要CAS机制?为什么需要CAS机制呢?我们先从一个错误现象谈起。我们经常使用volatile关键字修饰某一个变量,表明这个变量是全局共享的一个变量,同时具有了可见性和有序性。但是却没有原子性。比如说一个常见的操作a++。这个操作其实可以细分成三个步骤:(1)从内存中读取a(2)对a进行加1操作(3)将a的值重新写入内存中在单线程状态下这个操作没有一点问题,但是在多线程中就会出现各种各样的问题了。因为可能一个线程对a进行了加1操作,还没来得及写入内存,其他的线程就读取了旧...原创 2020-06-04 20:26:41 · 383 阅读 · 0 评论 -
面试题——实现一个容器,提供两个方法,add,size * 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束
1 用wait和notify实现public class NotifyFreeLock { volatile List lists = new ArrayList<>(); public void add(Object o) { lists.add(0); } public int size() { return lists.size(); } public static void main(St.原创 2020-06-09 19:04:45 · 835 阅读 · 0 评论 -
JUC常用工具类简单使用
1 ReentrantLockReentrantLock是一个互斥锁,也是一个可重入锁。ReentrantLock锁在同一个时间点只能被一个线程锁持有,但是它可以被同一个线程多次获取,每获取一次AQS的state就加1,每释放一次state就减1。还记得synchronized嘛,它也是可重入的,一个同步方法调用另外一个同步方法是没有问题的。在使用上无非就是获取锁和释放锁,我们完全可以用它来实现synchronized的功能。实现synchronized功能1.1ReentrantLock和原创 2020-06-09 14:34:37 · 473 阅读 · 0 评论