- 博客(32)
- 收藏
- 关注
并发容器和线程池,java并发编程3
JDK提供的这些容器⼤部分在java.util.concurrent包中。我们挑选出⼀些⽐较有代表性的并发容器
1
类,来感受⼀下JDK⾃带的并发集合带来的“快感”。
ConcurrentLinkedQueue是⼀个基于链接节点的⽆界线程安全队列,它采⽤先进先出的规则对节点
进⾏排序,当我们添加⼀个元素的时候,它会添加到队列的尾部,当我们获取⼀个元素时,它会返
回队列头部的元素。
● ConcurrentLinkedQueue算是在⾼并发环境中性能最好的队列。底层由单向链表组成,每个节点结
构如下所示:在⼤多数的应⽤场景中,读操作的⽐例远远⼤于写操作。那么,当执⾏读操作的时候,对数据是没
有修改的,所以,⽆须对数据进⾏加锁操作。⽽针对于写操作的场景中,则需要加锁来保证数据的
正确性。
● ⽽CopyOnWriteArrayList就可以满⾜上⾯所说的场景,即:读操作是不加锁的。⽽写操作也不会
阻塞读的操作,它采⽤了CopyOnWrite⽅式来解决写操作的问题,即:写⼊操作时,进⾏⼀次⾃我
复制产⽣⼀个副本,写操作就在副本中执⾏,写完之后,再将副本替换原来的数据。这样,就可以
在写数据的
2024-04-29
并发编程基础知识,java内存模型及多线程、volatile
Java内存模型,即:JMM。当程序执⾏并⾏操作时,如果对数据的访问和操作不加以控制,那么必
然会对程序的正确性造成破坏。因此,我们需要在深⼊了解并⾏机制的前提下,再定义⼀种规则,
来保证多个线程间可以有效地、正确地协同⼯作。⽽JMM就是为此⽽⽣的。
● JMM的关键技术点都是围绕着多线程的原⼦性、可⻅性和有序性来创建的。所以,下⾯我们来⼀⼀
介绍这三种特性。原子性、可见性、有序性。
正常情况下,如果我们不使⽤volatile,那么每条线程都会有⾃⼰的缓存,当全局变量被修改时,其
17
他线程可能并不会被通知到。
● volatile并不能真正的保证线程安全。它只能确保⼀个线程修改了数据后,其他线程能够看到这个改
动 当我们使⽤volatile去申明变量时,就等于告诉了虚拟机,这个变量极有可能会被某些程序或者线程
修改。为了确保这个变量被修改后,应⽤程序范围内的所有线程都能够“看到”这个改动,虚拟机就
必须采⽤⼀些特殊的⼿段,保证这个变量的可⻅性等特点。
在⼀个系统中,如果线程数量很多,⽽且功能分配⽐较明确,就可以将相同功能的线程放置在⼀个
线程组⾥。守护线程是⼀种特殊的线程,它会在后
2024-04-29
java并发编程-AQS和JUC实战
java并发包详解,condition重入锁;Semaphore信号量;ReadWriteLock读写锁;CountDownLatch计时器;CyclicBarrier循环栅栏;
重⼊锁可以完全替代synchronized关键字。在JDK5.0的早期版本中,重⼊锁的性能远远好于
synchronized,但从JDK6.0开始,JDK在synchronized上做了⼤量的优化,使得两者的性能差距并
不⼤。重⼊锁对逻辑控制的灵活性要远远好于synchronized。
之所以称之为重⼊锁,就是⼀个线程允许反复进⼊。当然,这⾥的反复仅仅局限于⼀个线程;如
果同⼀个线程多次获锁,那么在释放锁的时候,也必须释放相同次数。如果释放锁的次数多,那么
会得到⼀个java.lang.IllegalMonitorStateException异常,反之,如果释放锁的次数少,那么相当
于线程还持有这个锁
2024-04-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅