![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程专题
文章平均质量分 94
并发编程
初秋和
这个作者很懒,什么都没留下…
展开
-
10、阻塞队列BlockingQueue实战及其原理分析
LinkedBlockingQueue是一个基于链表实现的阻塞队列,默认情况下,该阻塞队列的大小为Integer.MAX_VALUE,由于这个数值特别大,所以 LinkedBlockingQueue 也被称作无界队列,代表它几乎没有界限,队列可以随着元素的添加而动态增长,但是如果没有剩余内存,则队列将抛出OOM错误。和它不同的是,LinkedBlockingQueue 的内部是用链表实现的,所以这里就需要我们考虑到,ArrayBlockingQueue 没有链表所需要的“节点”,空间利用率更高。原创 2023-03-21 00:10:38 · 249 阅读 · 0 评论 -
9、并发容器(Map、List、Set)实战及其原理
Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。所以,Java先提供了同步容器供用户使用。同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器。这样做的代价是削弱了并发性,当多个线程共同竞争容器级的锁时,吞吐量就会降低。因此为了解决同步容器的性能问题,所以才有了并发容器。原创 2023-03-20 23:54:54 · 453 阅读 · 0 评论 -
8. 读写锁ReentrantReadWriteLock&StampLock详解
读写锁ReadWriteLock,顾名思义是一把分为读和写两部分的锁,读锁允许多个线程同时获得,因为读操作本身是线程安全的。而写锁是互斥锁,不允许多个线程同时获得写锁。并且读和写操作也是互斥的。读写锁适合读多写少的业务场景。针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它内部,维护了一对相关的锁,一个用于只读操作,称为读锁;一个用于写入操作,称为写锁,描述如下:没有其他线程的写锁没有写请求或者有写请求,但调用线程和持有锁的线程是同一个。原创 2023-03-20 23:09:30 · 396 阅读 · 0 评论 -
7、ReentrantLock
java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都是基于AQS框架来实现的一般是通过一个内部类Sync继承 AQS将同步器所有调用都映射到Sync对应的方法AQS具备的特性。原创 2023-03-20 22:55:12 · 49 阅读 · 0 评论 -
6.JUC并发工具类
限流:Semaphore可以用于限制对共享资源的并发访问数量,以控制系统的流量。资源池:Semaphore可以用于实现资源池,以维护一组有限的共享资源。并行任务同步:CountDownLatch可以用于协调多个并行任务的完成情况,确保所有任务都完成后再继续执行下一步操作。多任务汇总:CountDownLatch可以用于统计多个线程的完成情况,以确定所有线程都已完成工作。资源初始化:CountDownLatch可以用于等待资源的初始化完成,以便在资源初始化完成后开始使用。原创 2023-03-19 20:59:33 · 110 阅读 · 0 评论 -
4、并发安全问题
什么是线程安全性?我们可以这么理解,我们所写的代码在并发情况下使用时,总是能表现出正确的行为;反之,未实现线程安全的代码,表现的行为是不可预知的,有可能正确,而绝大多数的情况下是错误的。如果要实现线程安全性,就要保证我们的类是线程安全的的。在《Java并发编程实战》中,定义“类是线程安全的”如下:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在调用代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。原创 2023-03-19 14:48:15 · 172 阅读 · 0 评论 -
3、CAS详解
实现原子操作可以使用锁,锁机制,满足基本的需求是没有问题的了,但是 有的时候我们的需求并非这么简单,我们需要更有效,更加灵活的机制, synchronized 关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候, 访问同一资源的其它线程需要等待,直到该线程释放锁, 这里会有些问题:首先,如果被阻塞的线程优先级很高很重要怎么办?这些原子操作类其实是使用当前的处理器基本都支持 CAS 的指令,比如 Intel 的汇编指令 cmpxchg,每个厂家所实现的具体算法并不一样,但是原理基本一样。原创 2023-03-19 12:48:11 · 362 阅读 · 0 评论 -
2、导致 JVM 内存泄露的 ThreadLocal
为什么要有ThreadLocal:首先看一段JDBC原生代码可以看到,在使用jdbc的时候,首先要配置后再拿到jdbc连接,然后在增删改查的业务中拿到这个连接,并把我们的SQL语句交给jdbc连接发送到真实的db上执行。在实际的工作中,我们不会每次执行SQL都临时去创建连接,而是会借助连接池,同时因为实际业务的复杂性,为了保证数据的一致性,我们还会引入事务操作,于是上面的代码就会变成:但是上面的代码开启事务后和执行insert操作会获取两个连接,导致事务失效。原创 2023-03-18 20:45:32 · 74 阅读 · 0 评论 -
1、从 0 开始深入理解并发、线程与等待通知机制
当然可以,用我们平时常用的 QQ 之类的聊天程序来举例,当我们用QQ 聊天时,其实程序要做好几件事,比如:接受我们的键盘输入,把输入的信息通过网络发给对方,接受对方通过网络发来的信息,把对方的信息显示在屏幕上,很多的时候,这些事情是可以同时发生的。如果设计一个多线程的程序的话,那它就可以同时在多个CPU 的多个核的多个线程上跑,可以充分地利用 CPU,减少 CPU 的空闲时间,发挥它的运算能力,提高并发量。比如我们经常用的迅雷下载,都喜欢多开几个线程去下载,谁都不愿意用一个线程去下载,为什么呢?原创 2023-03-17 15:14:58 · 183 阅读 · 0 评论