![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
隐0士
这个作者很懒,什么都没留下…
展开
-
java异步编程future模式实现实例讲解
先简单举个生活中的例子,比如说我们现在到中午了,想吃饭,这时候我们有两个选择,一个是去饭馆打包,另一种是拿起手机叫外卖。第一种呢需要我们自己亲自去饭馆,而且需要等待饭馆做好饭后我们再吃,这个过程可以看成是需要等待的,在程序上是同步的。第二种我们拿手机定好饭馆饭菜后,由饭馆的人做饭并叫外卖小哥送餐到宿舍,那么在这个时间段内就可以去做其他事情,不必一直等待,。在程序上可以看成是异步的。而java提供的future模式就是给我们写代码逻辑时的异步实现,在这里我们会写个代码例子来具体说明,下图中的客户端Fut原创 2020-11-08 11:30:53 · 868 阅读 · 0 评论 -
多线程wait、notify和notifyAll概念深入了解
本文转载自两篇博文,返回主页三月烟雨飘摇的南方 和你真的懂wait、notify和notifyAll吗将两篇文章的内容合并在一起了,方便以后自己看。首先先说一下相关知识点和结论:1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。3、转载 2020-11-08 11:08:55 · 248 阅读 · 0 评论 -
BlockingQueue阻塞接口的几个实现说明
本文章参考了wsmajunfeng的知识点,并对局部章节进行了实例补充一. 前言在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。二. 认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示:从上图我原创 2020-11-07 17:58:16 · 341 阅读 · 0 评论 -
ConcurrentMap实现
ConcurrentHashMap是为了解决使用hashMap线程不安全,但使用hashTabel安全但效率慢的问题,而hashTabel慢是由于其实现采用了同步锁机制,在高并发环境下使用将会导致多个线程争抢一把锁,即是出现锁竞争激烈的情况,使得效率低下,而ConcurrentHashMap的解决方案则是将其内部使用段(segment)概念,每个每段都可以视为是一个hashTable,相当于有16把不同的锁,当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是原创 2020-10-31 10:30:41 · 2167 阅读 · 0 评论 -
ThreadLocal线程局部变量
ThreadLocal是线程局部变量,是一种多线程并发访问变量的解决方案,与synchronized加锁方式不同,他完全不提供锁头,提倡以空间换时间的方式,为每个线程提供独立的副本,以保障线程安全。在并发量不是很高的时候,synchronized加锁的方式可能会更好,但当处于高并发或者锁竞争很激烈的场景时,使用ThreadLocal可以在一定程度上减少锁竞争。下面是验证ThreadLocal的小例子:package com.lydon.thread;import java.util.*;pub原创 2020-10-28 23:31:31 · 215 阅读 · 0 评论 -
同步类容器和异步类容器
java在很久以前提供了vector、HashTable等古老的同步类容器,这些容器其实都是线程安全的,面试过程中也经常有问到,的确这些容器关键的操作方法都是用synchronized关键字进行同步,底层对容器集合操作都是用Collections.synchronized等工厂方法,这样使得每次只能有一个线程访问,保证了安全性,但同时,在高并发的场景下性能却不能得到很好的保证,我们来看看vector的实现:```javapublic synchronized void setElementAt(E o原创 2020-10-28 23:26:51 · 173 阅读 · 0 评论 -
使用wait和notify模拟BlockingQueue实现
使用线程的通信机制实现queuepackage com.lydon.thread;import java.util.*;import java.util.concurrent.atomic.*;public class MyQueue { private final LinkedList<String> myQueue =new LinkedList(); private AtomicInteger curSize=new AtomicInteger();.原创 2020-10-27 23:03:29 · 86 阅读 · 0 评论 -
线程之间的通信
线程之间的通信在使用wait和notify进行通信时(所有对象都会有着两个方法),必须搭配synchronized使用,wait是会等待并释放锁,直到调用notify或notifyAll通知该锁对象,而调用notify方法不释放锁,下面讲述线程通信从初始版本到最终完整版的实现示例。初始版在不使用wait和notify时,普通的通信方式显得很傻,消耗无必要的资源,如下所示。package com.lydon.thread;import java.util.*;/** * 不好的线程之间原创 2020-10-26 23:07:14 · 108 阅读 · 0 评论 -
synchronized锁重入问题
先说结论:一个线程得到了一个对象的方法后,还可以调用这个对象的其他加锁的方法,一个线程执行在进入了子类的方法后,还可以调用父类的加锁方法。如下面所示:package com.lydon.thread;public class SyncDubbo { public synchronized void method1(){ System.out.println("i am method1"); method2(); } public sy原创 2020-10-25 21:53:19 · 250 阅读 · 0 评论 -
多线程脏读问题
在多线程运算中,如果没有考虑到业务的整体一致性,把整体中的各项操作没有使用synchronized来限制,则可能会出现脏读问题,如下面所示:package com.lydon.thread;/** * 脏读 */public class DirtyRead { private String username="zhangsan"; private String password="123"; public synchronized void setValue(St原创 2020-10-25 21:48:00 · 690 阅读 · 0 评论