Java并发
文章平均质量分 61
鲤鱼程序员
这个作者很懒,什么都没留下…
展开
-
BlockQuene阻塞队列
阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。Blocks:一直阻塞,当队列满时,如果生产者线程往队列put元素,会阻塞生产者线程,直到成功或者响应中断,当队列空时,消费者线程从队列里take元素,这时会阻塞线程获取元素,直到获取成功或响应中断。当队列满,生产者线程无法继续往队列添加,只有消费者线程消费了队列的元素,生产者线程才能继续在队列里添加元素。Throws exception:异常抛出,当队列满时插入元素和当队列空时取元素,这两种情况都会抛异常;原创 2023-04-16 01:49:10 · 214 阅读 · 0 评论 -
集合类不安全之并发修改异常
加,而是先将当前容器Object[]进行Copy,复制出一个新的容器Object[] newElements,然后新的容器Object[] newElements里添加元素,添加完元素之后,再将原容器的引用指向新的容器setArray(newElements);在并发情况下,一些集合类会出现并发的写问题,例如ArrayList,HashMap,HashSet这三种,以下对这三种进行分析,其他的也是如此。4.1 Vector是JDK1.0添加的类,是线程安全的,但性能不行,这里不进行详细分析。原创 2023-04-15 20:15:16 · 498 阅读 · 0 评论 -
volatile的关键字
volatile 具有可见性,但它不保证原子性,解决原子性的问题时,我们优先选择JUC锁的Atomic,synchronized是重量级锁,一般情况下不优先使用,上面的例子可以用Atomic解决,我们就用Atomic解决它的原子性问题。volatile是Java虚拟提供的轻量级同步机制,具有可见性,不保证原子性,禁止指令重排的特点。原创 2023-04-11 00:51:27 · 279 阅读 · 0 评论 -
CAS底层原理
这是一种完全依赖于硬件的功能,通过它实现了原子操作。由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题。根据对象和偏移量得到在主内存的快照值var5,再使用compareAndSwapInt方法通过var1和var2得到当前主内存的实际值,若相等,则更新var5 + var4的值到主内存中并返回true,若不相等,则再次进入循环中。原创 2023-04-15 15:55:52 · 254 阅读 · 0 评论 -
CAS引发的ABA问题
我们在使用CAS时,当两个线程要修改同一个值,第一个修改初始数值为100,而第二个线程修改初始数值100为101,然后又将101修改为100。如果第二个进行了100->101->100这个过程的修改后,第一个线程再修改,此时就出现了ABA问题,第一个线程修改的100不是原来的100,而是被第二个线程修改过的100。我们发现它成功修改为2021,而此刻的100时被第一个线程修改过的,不是原来的那个值,这就是ABA问题。我们可以加个版本号,这样就可以通过版本号来判断它是否被修改过。原创 2023-04-15 16:05:43 · 240 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier和Semaphore
CountDownLatch 和 CyclicBarrier都能实现线程间的等待,CountDownLatch 用于某个线程等待其他线程执行完任务后再开始执行,而CyclicBarrier则是所有线程等待至某个状态再同时开始执行任务。Semaphore这个用于资源的竞争,原创 2023-04-15 16:52:13 · 205 阅读 · 0 评论