![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发学习
一只很菜的程序员
菜鸟成长录
展开
-
java并发之死锁篇
在多线程中,我们使用加锁机制来确保线程安全,但如果使用不当,则可能导致死锁。JVM解决死锁问题方面,并不像数据库服务那么强大(数据库系统设计中考虑了检测死锁以及从死锁中恢复),当一组Java线程发生死锁时,"游戏"到此结束,这些线程永远不能再使用了。 死锁的含义:当线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试所得锁L,那么这两个线程将永远的等待下去,这种情况就是最简单的死锁...原创 2018-07-31 17:19:52 · 170 阅读 · 0 评论 -
java并发之内存模型
背景:在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。Java...原创 2018-08-07 08:57:30 · 214 阅读 · 0 评论 -
java并发之synchronized的实现原理
场景: 在多线程并发编程中synchronized一直是元老级角色,作为最基本的互斥手段,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。 3种形式: 先来看下利用synchronize...原创 2018-09-04 23:37:52 · 329 阅读 · 0 评论 -
java并发之线程池(ThreadPoolExecutor源码分析)
场景:Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。 使用线程池的好处: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调...原创 2018-11-04 11:32:56 · 208 阅读 · 0 评论 -
java并发之原子操作类(AtomicLong源码分析)和非阻塞算法
背景 近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令(例如比较并发交换指令)代替锁来确保数据在并发访问中的一致性。非阻塞算法被广泛的用于在操作系统和JVM中实现线程/进程调度机制、垃圾回收机制以及锁和其他并发数据结构。 与基于锁的方案相比,非阻塞算法在设计和实现上都要复杂的多,但他们在可伸缩性和活跃性上却拥有巨大的优势,由于非阻塞算法可以使多个线程在竞...原创 2018-11-18 12:05:55 · 3021 阅读 · 0 评论 -
Java并发之AQS用法和源码分析
概念 AQS:队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,许多同步器可以通过AQS很容易的并且高效的构建出来。不仅RenntrantLock和Semaphore是基于AQS构建的,还包括CountDownLatch、ReentrantReadWriteLock、SynchronousQueue和FutureTask。 同...原创 2018-12-23 17:02:07 · 192 阅读 · 0 评论 -
Java并发学习之ArrayBlockingQueue 源码分析
Java并发之ArrayBlockingQueue 源码分析 阻塞队列 定义 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。 支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列...原创 2019-05-26 18:36:14 · 237 阅读 · 0 评论