![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 95
常用的JAVA并发容器
程序猿小泽
你知道的越多,你不知道的越多!
展开
-
多线程知识笔记
这里写目录标题减少上下文切换方法死锁基本概念同步VS异步并发与并行阻塞和非阻塞临界区线程创建三种方式线程状态的基本操作interruptedjoinyield守护线程Daemon减少上下文切换方法通常减少上下文切换可以采用无锁并发编程,CAS算法,使用最少的线程和使用协程。无锁并发编程:可以参照concurrentHashMap锁分段的思想,不同的线程处理不同段的数据,这样在多线程竞争的条件下,可以减少上下文切换的时间。CAS算法,利用Atomic下使用CAS算法来更新数据,使用了乐观锁,可以有效的原创 2020-05-26 14:18:08 · 180 阅读 · 0 评论 -
彻底理解volatile
目录volatile简介volatile实现原理volatile的happens-before关系volatile的内存语义实现volatile简介synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁。而volatile是java虚拟机提供的最轻量级的同步机制。Java内存模型告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。线程在工作内存进行操作后何时会写到主内存中?这个时机对普通变量是没有规定的,而针对volatile修转载 2020-05-26 14:16:15 · 495 阅读 · 1 评论 -
wait、notify、notifyAll的理解与使用
目录基础知识waitnotifynotifyAllwait()与notify()操作会释放锁吗?wait/notify 消息通知潜在的一些问题总结:生产者-消费者模型的实现基础知识Java 中,可以通过配合调用 Object 对象的 wait() 方法和 notify() 方法或 notifyAll() 方法来实现线程间的通信。在线程中调用 wait() 方法,将阻塞当前线程,直至等到其他线程调用了调用 notify() 方法或 notifyAll() 方法进行通知之后,当前线程才能从 wait()原创 2020-05-26 12:11:10 · 6197 阅读 · 0 评论 -
FutureTask基本操作总结
目录FutureTask 简介get 方法cancel 方法FutureTask 的基本使用FutureTask 简介在 Executors 框架体系中,FutureTask 用来表示可获取结果的异步任务。FutureTask 实现了 Future 接口,FutureTask 提供了启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果的一些常用的方法。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任务执行结束。一旦任务执行结束,任务不能重新启动或取消,除非调用ru转载 2020-05-25 15:20:43 · 1370 阅读 · 0 评论 -
并发容器之CopyOnWriteArrayList
目录CopyOnWriteArrayList 的简介COW 的设计思想CopyOnWriteArrayList 的实现原理get 方法实现原理add 方法实现原理总结CopyOnWriteArrayList 的简介java 学习者都清楚 ArrayList 并不是线程安全的,在读线程在读取 ArrayList 的时候如果有写线程在写数据的时候,基于 fast-fail 机制,会抛出ConcurrentModificationException异常,也就是说 ArrayList 并不是一个线程安全的容器,转载 2020-05-24 12:01:04 · 106 阅读 · 0 评论 -
深入理解读写锁ReentrantReadWriteLock
目录读写锁的介绍写锁详解写锁的获取写锁的释放读锁详解读锁的获取读锁的释放锁降级读写锁的介绍在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获取锁。而在一些业务场景中,大部分只是读数据,写数据很少,如果仅仅是读数据的话并不会影响数据正确性(出现脏读),而如果在这种业务场景下,依然使用独占锁的话,很显然转载 2020-05-23 20:24:20 · 488 阅读 · 1 评论 -
彻底理解ReentrantLock
目录ReentrantLock的介绍重入性的实现原理公平锁与非公平锁公平锁 VS 非公平锁ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。那么,要想完完全全的弄懂ReentrantLock的话,主要也就是ReentrantLock同步语义的学习:1. 重入性的实现原理转载 2020-05-23 15:47:49 · 170 阅读 · 0 评论 -
深入理解AbstractQueuedSynchronizer(AQS)
目录AQS简介同步队列独占锁独占锁的获取(acquire方法)独占锁的释放(release()方法)可中断式获取锁(acquireInterruptibly方法)超时等待式获取锁(tryAcquireNanos()方法)共享锁共享锁的获取(acquireShared()方法)共享锁的释放(releaseShared()方法)可中断(acquireSharedInterruptibly()方法),超时等待(tryAcquireSharedNanos()方法)AQS简介在同步组件的实现中,AQS是核心部分,转载 2020-05-23 14:47:47 · 281 阅读 · 0 评论 -
彻底理解synchronized
目录synchronized实现原理对象锁(monitor)机制synchronized的happens-before关系锁获取和锁释放的内存语义synchronized优化CAS操作什么是CAS?CAS的操作过程CAS的应用场景CAS的问题ABA问题自旋时间过长只能保证一个共享变量的原子操作Java对象头偏向锁轻量级锁各种锁的比较synchronized实现原理在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景:如图,syn转载 2020-05-22 21:02:23 · 161 阅读 · 0 评论 -
Java内存模型以及happens-before规则
JMM的介绍什么是线程安全问题?在多线程下代码执行的结果与预期正确的结果不一致,该代码就是线程不安全的,否则则是线程安全的。在<<深入理解Java虚拟机>>中看到的定义。原文如下:当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。出现线程安全的问题一般是因为主内存和工作内存数据不一致性和重排序导致的,而解决线程安全的问题最重转载 2020-05-22 20:37:18 · 267 阅读 · 0 评论 -
并发容器之ConcurrentHashMap(JDK 1.8版本)
目录ConcurrentHashmap 简介关键属性及类ConcurrentHashMap 的关键属性ConcurrentHashMap 中关键内部类CAS 关键操作重点方法讲解实例构造器方法initTable 方法put 方法get 方法transfer 方法与 size 相关的一些方法mappingCount 与 size 方法addCount 方法总结ConcurrentHashmap 简介在使用 HashMap 时在多线程情况下扩容会出现 CPU 接近 100%的情况,因为 hashmap 并不转载 2020-05-14 16:23:23 · 183 阅读 · 0 评论