![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 86
你这家伙
这个作者很懒,什么都没留下…
展开
-
concurrentHashMap
像我们知道的Arraylist,LinkedList,HashMap,HashSet…都是线程不安全的,而Vector,Stack,HashTable是又是线程安全的那么如果想在多线程下使用ArrayList怎么办呢?方法:自己加锁使用synchronizedList使用JUC里面的CopyOnWriteArrayList如果想要在多线程下使用HashMap怎么办呢?方法:HashTable(不太建议使用)ConcurrentHashMap(推荐使用)...原创 2021-08-09 10:45:27 · 118 阅读 · 0 评论 -
java.util.concurrent.*下的常见类你了解多少?
java.util.concurrent.*是标准库提供的一组工具类,帮我们简化并发编程1.concurrent下的locks锁1.1.locks锁下常见的锁![在这里插入图片描述](https://img-blog.csdnimg.cn/b9bd751d7875497ba5693a76c5da8025.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4u.原创 2021-08-09 09:08:21 · 223 阅读 · 0 评论 -
锁优化问题
前面我们提到了锁策略问题,那么锁又如何优化的呢?1.锁的实现原理既然要知道锁的优化问题,首先的知道锁的实现原理(以加锁为例):先通过原子操作,检查并更新(CAS完成)一块内存区域,如果修改成功过,则表示加锁成功,否则表示加锁失败(更新的内存区域可以想象成哪个线程持有了这个锁)(用户/内核实现)如果更新失败。表示锁被别的线程占用了(用户/内核实现)如果被占用了,就挂起等待或者自旋或者…(用户/内核实现)如果是挂起等待锁,就把该线程放到一个锁对应的等待队列中,后面锁释放了之后才有机会被唤醒(内.原创 2021-08-08 13:01:22 · 92 阅读 · 0 评论 -
++操作你还在使用加锁去保证线程的安全吗?确定不了解一下CAS机制?
什么是CASCAS(Compare and swap),字面意思可以理解为“比较和交换”:它其实就是假设内存中原有的数据为 V ,旧的预期值为 A 需要修改的值为 B,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。当多个线程同时对某个资源进行CAS操作,只能有一个线程操作成功,但是并不会阻塞其他线程,其他线程只会收到操作失败的信号。可见 CAS 其实是一个乐观锁。通俗的将就是针对某个内存地址的内容,猜一下里面的值,如果猜对了,就将这个值更换成一个新的值,.原创 2021-08-08 11:05:54 · 121 阅读 · 0 评论 -
别翻了,常见的锁策略就在这里了~
咱们其他也就不多说了,就直奔主题了~1.乐观锁 VS 悲观锁**悲观锁:**总是假设最坏的情况,每次取拿数据的时候都认为别人会修改,所以在拿数据的时候都会上锁,这样别热你想拿到这个数据就会阻塞直到它拿到锁。(多个线程同时竞争锁)**乐观锁:**乐观锁假设认为数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正式堆数据是否并发冲突进行检测,如果并发冲突了,则会返回用户错误信息,让用户决定如何取做。悲观锁存在的问题:认为多个线程同时竞争锁的概率很高,但是愿意花更多的成本来解决锁竞争问题原创 2021-08-07 23:32:35 · 181 阅读 · 0 评论