多线程并发编程
茯苓1998
这个作者很懒,什么都没留下…
展开
-
juc--线程池
利用Executors类来创建三种线程池这三种线程池分别是FixedThreadPool,SingleThread,CachedThreadPool类型特点FixedThreadPool可以指定固定的线程数的线程池SingleThread只提供一个线程的线程池CachedThreadPool能根据当前业务繁忙情况动态地增加和减少线程数的线程池代码演示 /** * * @Title: testThree * @Description: 用原创 2020-09-12 13:35:50 · 343 阅读 · 0 评论 -
juc--阻塞队列BlockingQueue
阻塞队列BlockingQueue的方法分类方法类型抛出异常特殊值阻塞超时插入add(e)offer(e)put(e)offer(e,time,unit)移除remove()poll()take()poll(time,unit)检查element()peek()不可用不可用抛出异常当阻塞队列满时,再往队列里add插入元素会抛出异常。当阻塞队列为空时,再从队列里remove移除元素会抛异常特殊值插入方法,成功返原创 2020-09-11 20:54:22 · 132 阅读 · 0 评论 -
juc--ReadWriteLock的使用
ReadWriteLock是读写锁,它解决了传统synchronized锁和Lock锁并发效率低的问题ReadWriteLock的优点和解决的问题我们都知道,在多线程并发的情况下要给资源类加锁,一个时间段只有一个线程能够访问该资源类的加锁操作,保证了数据的正确性。但是这也同时降低了并发性。写-写,读-写必须要加锁,而读-读是不需要加锁的,但synchronized锁和Lock锁把读-读也上了锁,这必然导致并发效率降低。ReadWriteLock读写锁可以完美地解决以上的问题,对资源的”写“操作加上写锁原创 2020-09-11 14:55:23 · 75 阅读 · 0 评论 -
juc--Semaphore(信号量)的使用
juc包里的Semaphore信号量主要应用在多线程争抢多资源的情况下在信号量上我们定义两种操作acquire(获取):当一个线程调用acquire操作时,他要么通过成功获取信号量(信号量减一),要么一直等下去,直到有线程释放信号量,或超时release(释放):实际上会将信号量的值加一,然后唤醒等待的线程信号量主要用于两个目的控制多个共享资源的互斥使用控制并发线程数Semaphore信号量的应用小demo场景:现在有三个停车位,有六辆车想要争抢停车位public static v原创 2020-09-11 13:53:41 · 342 阅读 · 0 评论 -
juc--CyclicBarrier的使用
CyclicBarrier是juc包里的一个工具类,它能实现的功能是:每当执行了指定次数的倍数的await方法后就会唤醒所有因调用cyclicBarrier.await而阻塞的线程,并触发指定事件CyclicBarrier应用小demo场景:现在有14个线程准备参加体育课考试,要求分成两波考试,先到达考场的7个人组成一波参加考试,后面剩余的再组成一波参加考试public static void main(String[] args) { CyclicBarrier cyclicBarrier =原创 2020-09-11 09:32:45 · 130 阅读 · 0 评论 -
juc--CountDownLatch的使用
CountDownLatch是一个倒计数的工具,我们举一个例子来应用它场景:班长要等所有人都出教室之后才能把门锁上,现在班长是主线程,而同学们是各个并发线程,要等所有的并发线程都执行完”离开教室“操作后,班长才能执行”锁门“操作public static void main(String[] args) { CountDownLatch countDownLatch = new CountDownLatch(10); for(int i = 0; i < 10; i++) { in原创 2020-09-10 23:57:22 · 93 阅读 · 0 评论 -
juc包里callable的使用
创建多线程的传统方法有两种继承Thread类实现Runable接口java5之后新增了另一种方法–实现Callable接口实现Runable接口与实现Callable接口的对比实现Runable接口class RunableTest implements Runnable{ @Override public void run() { } }实现Callable接口class CallableTest implements Callable<Integer>原创 2020-09-10 23:25:33 · 154 阅读 · 0 评论 -
不安全的集合类map以及解决方法
map是一个线程不安全的集合类,主要原因就是其读写方法并没有加锁解决方法:使用Collections.synchronizedMap(map)包装map使用juc里的ConcurrentHashMap替代map原创 2020-09-10 22:05:00 · 209 阅读 · 0 评论 -
不安全的集合类set以及解决方法
set是一个线程不安全的集合类,主要原因就是其读写方法并没有加锁源码public boolean add(E e) { return map.put(e, PRESENT)==null;}可以看到,它并没有对写操作加锁解决方法:使用Collections.synchronizedSet(set)包装set使用juc里的CopyOnWriteArraySet替代set...原创 2020-09-10 22:02:15 · 170 阅读 · 0 评论 -
不安全的集合类list以及解决方法
java提供的集合类list为不安全类不安全类是什么意思?不安全类指的是在多线程并发的时候不能保证数据正确性的类,通常是由于这些类并没有加锁造成的。为什么不设计为加锁的呢?其实,在list之前有一个集合类vector,它是内部加锁的,它是一个线程安全类,但为何我们却不优先去使用它呢,我们要知道,加锁可以保证数据的正确性,但却降低了并发效率!我们要怎么做才能保证数据的正确性呢?使用vector替代list(并发效率降低)使用Collections.synchronizedList(list)包原创 2020-09-10 20:19:56 · 469 阅读 · 0 评论 -
多线程的8锁问题
我们现在有一个资源类Phone,它有两个基础操作,sendEmail发送邮件和sendMessage发送短信,这两个操作均加上了synchronized锁问题:1.标准访问,请问是先打印邮件还是短信?/** * * @ClassName: Phone * @Description: 手机资源类 * @author: fuling * @date: 2020年9月10日 下午1:29:17 */class Phone{ /** * * @Title: sendEmail原创 2020-09-10 19:10:50 · 153 阅读 · 0 评论 -
多线程-juc-lock实现精准唤醒
用juc包里lock+await+signal的组合替换传统的synchronized+wait+notify,以实现精准通知,精准唤醒场景:有三种线程A,B,C,让它们轮流打印:A打印5遍“我是A”,B打印10遍“我是B”,C打印15遍“我是C”,A打印5遍“我是A”…这样交替打印。现假设A,B,C各有10个线程代码:/** * * @ClassName: Printer * @Description: 打印机资源类 * @author: fuling * @date: 2020年9原创 2020-09-10 12:57:00 · 252 阅读 · 1 评论 -
多线程编程-“对资源的使用条件做判断时”使用while和if的区别
传统的synchronized是系统锁,通常搭配Object类中的await和notify使用,这种组合的一个缺点:不能实现特定唤醒,容易造成虚假唤醒。例子:现在有一个资源类“蛋糕”,两个操作,“买蛋糕”和“做蛋糕”,这里有两个线程,两个“蛋糕店线程“,两个“顾客线程”。当蛋糕数量为0时,“蛋糕店线程“执行“做蛋糕操作”,当蛋糕数量为1时,顾客执行“买蛋糕操作”。代码:在这里插入代码片我们的想法是,当“顾客线程“想要执行“买蛋糕”操作时发现“蛋糕”数量为0时,“顾客线程”应该wait让出锁,等原创 2020-09-09 23:50:28 · 336 阅读 · 0 评论