![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程并发
文章平均质量分 76
ack_Finding
这个作者很懒,什么都没留下…
展开
-
CountDownLatch和CyclicBarrier
一、CountDownLatchCountDownLatch是拦截线程等待事件发生,提供了一个countDown方法来操作计数器的值,每调用一次countDown方法计数器都会减1,直到计数器的值减为0时就代表条件已成熟,所有因调用await方法而阻塞的线程都会被唤醒。1、下面是java源码的两个demo:(1) /** * * startSignal:司机准备好之前,...原创 2018-07-10 09:28:37 · 232 阅读 · 0 评论 -
ThreadLocal
1、简介ThreadLocal提供了一种访问某个变量的特殊方式:访问到的变量属于当前线程,即保证每个线程的变量不一样,而同一个线程在任何地方拿到的变量都是一致的,这就是所谓的线程隔离ThreadLocalMap并不是为了解决线程安全问题,而是提供了一种将实例绑定到当前线程的机制,类似于隔离的效果,实际上自己在方法中new出来变量也能达到类似的效果。ThreadLocalMap跟线程安全基本...原创 2019-03-02 21:59:20 · 786 阅读 · 3 评论 -
《Java并发编程实战》笔记6——notify、notifyAll
只有同时满足以下两个条件时,才能用单一的notify而不是notifyAll:a.所有等待线程的类型都相同,只有一个条件谓词与条件队列相关,并且每个线程在从wait返回后将执行相同的操作。b.单进单出。在条件变量上的每次通知,最多只能唤醒一个线程来执行。 ...转载 2018-10-10 12:45:52 · 273 阅读 · 0 评论 -
ReentrantLock、ReentrantReadWriteLock
一、ReentrantLockReentrantLock是可重入锁,已经获得锁的线程可以再次获得锁,如果一个线程获取了n个锁,那么释放的时候同样要释放n个锁。同步组件主要是通过重写AQS的几个protected方法来表达自己的同步语义。ReentrantLock主要的方法: //获取锁 public void lock() { sync.lock(); ...原创 2018-10-08 22:53:17 · 233 阅读 · 0 评论 -
《Java并发编程实战》笔记4——避免活跃性危险
1、死锁(1)锁顺序死锁例子:public class LeftRightDeadlock { private final Object left = new Object(); private final Object right = new Object(); public void leftRight() { synchronized ...原创 2018-09-21 16:37:15 · 272 阅读 · 0 评论 -
《Java并发编程实战》笔记5——性能与测试
性能与可伸缩性1、小工具(1)perfar:测试CPU忙碌程度信息(2)iostat、perfmon:判断是否是I/O密集2、单个任务的处理时间不仅包括执行任务Runnable的时间,也包括从共享队列中取出任务的时间。如果通过加锁来保护队列的状态,那么当一个线程从队列中取出任务时,其他需要获取下一个任务的线程就必须等待,这就是任务处理过程中的串行部分。在所有的并发程序中都包含一...原创 2018-09-25 15:55:04 · 170 阅读 · 0 评论 -
《Java并发编程实战》笔记1——Java线程安全基础
1、什么是线程安全?多个线程访问某个类时,不管运行时环境采用何种调用方式或者这些线程将如何交替执行,并且在主调代码中不需要任何的额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。(摘自Java并发编程实战)2、无状态对象一定是线程安全的。那么,什么才称为无状态呢?有状态是指有数据存储的功能,也就是有实例变量。无状态是指不包含任何域,也不包含对其他类中域的引用。(...原创 2018-09-14 17:13:24 · 209 阅读 · 0 评论 -
Iterator源码解析及和for-each循环
在使用foreach循环遍历集合的过程中,如果集合被修改了,会抛出ConcurrentModificationException异常。以这段代码为例子:public class SynProblem { List<Widget> widgetList = Collections.synchronizedList(new ArrayList<>()); { ...原创 2018-09-14 17:12:22 · 263 阅读 · 0 评论 -
《Java并发编程实战》笔记3——线程池的使用
1、线程饥饿死锁在线程池中,如果任务依赖于其他任务,那么可能发生死锁。在单线程的Executor中,如果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交任务的结果,那么通常会引发死锁。如下面代码所示:public class ThreadDeadlock { ExecutorService exec = Executors.newSingleT...原创 2018-09-19 12:37:23 · 183 阅读 · 0 评论 -
《Java并发编程实战》笔记2——取消与关闭
1、取消(1)生产者消费者问题中,如果采用BlockingQueue阻塞队列。假如生产者生产的速度超过了消费者的处理速度,队列将被填满,put操作也会被阻塞。当生产者在put方法中阻塞时,如果消费者希望取消生产者任务,它可以通过调用cancel方法来设置cancelled标志,但此时生产者却永远不能检查这个标志,因为它无法从阻塞的方法中恢复过来(消费者已经停止从队列中取出素数,所以put方法将...原创 2018-09-17 18:06:31 · 276 阅读 · 0 评论 -
线程饥饿死锁
/** * 线程饥饿死锁——在单线程Executor中发生死锁 */public class ThreaDeadLock { //单线程Executor ExecutorService exec = Executors.newSingleThreadExecutor(); class RenderPageTask implements Callable<Str...原创 2018-07-22 22:51:56 · 295 阅读 · 0 评论 -
Lock、AbstractQueuedSynchronizer
一、Lock简介Lock是并发访问共享资源的另一种方式,当需要使用chain lock这种时会很灵活,jdk文档中举了一个例子:(For example, some algorithms for traversing concurrently accessed data structures require the use of "hand-over-hand" or "chain locki...原创 2018-09-29 10:24:34 · 218 阅读 · 0 评论 -
volatile和final
1、关于内存屏障:(摘自内存屏障)(1)LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。(2)StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。(3)Loa...转载 2018-07-16 15:42:57 · 561 阅读 · 0 评论 -
CAS以及其ABA问题及解决方法
1、简述常见的Java并发手段是加锁,但加锁、解锁操作是消耗性能的。相比起来,CAS无锁方案则没有加锁、解锁的性能消耗,还保证了互斥性,但同时也存在ABA的问题2、CASCAS的语义是:将内存位置的值与预期原值比较,如果相匹配,那么处理器会自动将该位置值更新为新值,否则,处理器不做任何操作。CAS是一条CPU的原子指令(cmpxchg指令),是通过Unsafe类的方法实现的,Unsaf...原创 2019-04-21 18:49:50 · 630 阅读 · 0 评论