
并发编程
Hermione Granger
To be or not to be,that's a question.
展开
-
再谈Java多线程编程中的虚假唤醒
虚假唤醒和你写的程序逻辑无关!这是偏于底层的锅,是否看到有些博客写的虚假唤醒难以理解?各种逻辑看似合理,但却给出了虚假唤醒的错误解释?那么来看这篇文章吧,可以满足你的需求。首先,先看一波《Java并发编程的艺术》中关于等待/通知的经典范式的描述:等待方遵循如下原则:获取对象的锁。如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件。条件满足则执行对应的逻辑。对应的...原创 2019-12-18 11:18:07 · 422 阅读 · 0 评论 -
同步方法和静态同步方法使用的锁的类型
synchronized 修饰方法使用锁是当前this锁。synchronized 修饰静态方法使用锁是当前类的字节码文件。原创 2019-06-17 17:53:17 · 12498 阅读 · 0 评论 -
(六)并发编程之Java中的锁
公平锁和非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁类似排队打饭 先来后到非公平锁是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象两者的区别:公平锁/非公平锁并发包ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或者非公平锁 默认是非公平锁注:...原创 2019-05-27 21:50:28 · 17216 阅读 · 1 评论 -
(五)并发编程之容器类
java.util.ConcurrentModificationException标题的错误是由于多线程并发争抢修改导致的,在并发编程中使用线程不安全的容器导致的下面晒出导致错误的例子:package com.bestqiang.thread.Collections;import java.util.List;import java.util.UUID;import java.ut...原创 2019-05-27 21:18:22 · 17455 阅读 · 0 评论 -
(四)并发编程之CAS
CAS是什么?CAS ===》 compareAndSet 或者 compareAndSwap ,比较并交换,暂时这样理解,下面会对CAS做具体分析。public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger...原创 2019-05-27 20:26:05 · 17165 阅读 · 0 评论 -
(三)并发编程之线程池
为什么要使用线程池,优势是什么?线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果线程超过了最大数量,超出的数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行.他的主要特点为:线程复用控制最大并发数管理线程.第一:降低资源消耗.通过重复利用自己创建的线程降低线程创建和销毁造成的消耗.第二: 提高响应速度.当任务到达...原创 2019-05-27 16:31:14 · 17808 阅读 · 0 评论 -
(二)Java中的并发队列和阻塞队列
并发队列在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列非阻塞队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。阻塞队列与非阻塞队1.阻塞队列阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获...原创 2019-05-17 17:48:33 · 19110 阅读 · 1 评论 -
(一)并发包中的(计数器)CountDownLatch,(屏障)CyclicBarrier,(计数信号量)Semaphore
(计数器)CountDownLatchCountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就...原创 2019-05-17 16:14:55 · 17401 阅读 · 0 评论 -
多线程之间按顺序调用,实现A->B->C三个线程启动(使用Lock锁)
题目:多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下:AA打印5次,BB打印10次,CC打印15次…来十轮思路:使用Lock锁的多个Condition实现精准唤醒。package com.bestqiang.thread.Queue;/** * @author BestQiang */import java.util.concurrent.loc...原创 2019-05-17 15:43:34 · 19058 阅读 · 0 评论 -
关于多线程中的虚假唤醒的原因和解决,以及分别用Lock锁和阻塞队列实现消费者生产者案例
虚假唤醒: 有这么一种情况,在一个线程调用wait()进行等待时,被其他线程所唤醒,但是这时同时有另外的线程也被唤醒了,它抢先运行后,使得原来的唤醒条件又不满足了,这时就悲剧了,这个线程就称为被虚假唤醒了。 有人说,它所在的线程是加锁的,唤醒后不是依然不能运行吗,是的,但是它被唤醒了,等到获取锁后,依然会运行。解决: 所以为了避免这种情况,只好用while循环避免虚假唤醒。(因为if只判断一...原创 2019-05-17 15:21:40 · 18353 阅读 · 4 评论