
线程与并发
文章平均质量分 95
zhumqs
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java并发编程(一)------并发的相关概念
参考文章:【高并发Java一】前言1、关于高并发的几个重要概念1.1 同步和异步首先这里说的同步和异步是指函数/方法调用方面。很明显,同步调用会等待方法的返回,异步调用会瞬间返回,但是异步调用瞬间返回并不代表你的任务就完成了,他会在后台起个线程继续进行任务。1.2 并发和并行并发和并行在外在表象来说,是差不多的。由图所示,并行则是两个任务同时进行,而并发呢,则是一会...原创 2018-07-30 13:47:47 · 238 阅读 · 0 评论 -
Java并发编程(十一)------LockSupport工具类
1. 基本方法当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应工作。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread thread)方法来唤醒一个被阻塞的线程。Par...原创 2018-08-01 15:35:25 · 318 阅读 · 0 评论 -
Java并发编程(十二)------condition接口
1. Condition接口任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模...原创 2018-08-01 15:47:56 · 244 阅读 · 0 评论 -
Java并发编程(十三)------Java并发容器之ConcurrentHashMap
1. 为什么并发编程中不使用HashMap?在并发编程中使用HashMap可能导致程序死循环,而使用线程安全的HashTable效率又非常低下。(1)线程不安全的HashMap在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。例如,执行以下代码会引起死循环。final HashMap<Stri...原创 2018-08-01 16:54:25 · 237 阅读 · 0 评论 -
Java并发编程(十四)------Java并发容器之阻塞队列
转载自并发编程网 – ifeve.com阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者...转载 2018-08-01 19:48:22 · 211 阅读 · 0 评论 -
Java并发编程(十五)------Fork/Join框架
参考文章:聊聊并发(八)——Fork/Join框架介绍1. 什么是Fork/Join框架就是分而治之的思想Fork/Join类似MapReduce算法,两者区别是:Fork/Join 只有在必要时如任务非常大的情况下才分割成一个个小任务,而 MapReduce总是在开始执行第一步进行分割。看来,Fork/Join更适合一个JVM内线程级别,而MapReduce适合分布式系统。For...转载 2018-08-01 20:23:35 · 236 阅读 · 0 评论 -
Java并发编程(十八)------Java并发工具类
在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Semaphore工具类分别提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段。1. 等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。假如有这样一个需求:我们需要解析一个Exce...原创 2018-08-03 18:00:48 · 207 阅读 · 0 评论 -
Java并发编程(二十)------并发设计模式之单例模式
单例模式单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为,比如全局信息配置。1. 单例模式最简单的实现public class Singleton { private Singleton() { System.out.println("Singleton is create"); } private sta...原创 2018-08-03 20:59:13 · 225 阅读 · 0 评论 -
Java并发编程(十九)------锁的优化
本文转载自:https://my.oschina.net/hosee/blog/6158651. 锁优化的思路和方法一旦用到锁,就说明这是阻塞式的,所以在并发度上一般来说都会比无锁的情况低一点。这里提到的锁优化,是指在阻塞式的情况下,如何让性能不要变得太差。但是再怎么优化,一般来说性能都会比无锁的情况差一点。这里要注意的是,在JDK并发包中提到的ReentrantLock中的tryLo...转载 2018-08-03 18:42:50 · 182 阅读 · 0 评论 -
Java并发编程(十六)------Java中的线程池
本文转载自:https://blog.youkuaiyun.com/u010425776/article/details/566735641. 线程池的作用 减少资源的开销 减少了每次创建线程、销毁线程的开销。 提高响应速度 每次请求到来时,由于线程的创建已经完成,故可以直接执行任务,因此提高了响应速度。 提高线程的可管理性 线程是一种稀缺资源,若不加以限制,不仅会占...原创 2018-08-02 11:49:28 · 185 阅读 · 0 评论 -
Java并发编程(十七)------Executor框架和FutureTask
1. Executor两级调度模型在HotSpot虚拟机中,Java中的线程将会被一一映射为操作系统的线程。 在Java虚拟机层面,用户将多个任务提交给Executor框架,Executor负责分配线程执行它们; 在操作系统层面,操作系统再将这些线程分配给处理器执行。这种两级调度模型的示意图如下所示,从图中可以看出,应用程序通过Executor框架控制上层的调度;而下层的调度由操作系统...原创 2018-08-02 14:49:15 · 807 阅读 · 0 评论 -
Java并发编程(十)------ReadWriteLock读写锁
1. 读写锁1.1 与排他锁的区别之前提到锁(如Mutex和ReentrantLock)基本都是排他锁(在同一时刻只允许一个线程进行访问),而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。1.2 原理除了保证写操作对读操作的可见性以及并...原创 2018-08-01 15:21:05 · 335 阅读 · 0 评论 -
Java并发编程(九)------ReentrantLock重入锁
1. Lock接口1.1 Lock和synchronized的区别锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了...原创 2018-08-01 14:58:17 · 205 阅读 · 0 评论 -
Java并发编程(二)------线程基本操作和状态转换图
参考文章:[高并发Java 二] 多线程基础 线程的几种状态转换 1.线程概念线程是进程内的执行单元。使用线程的原因是,进程的切换是非常重量级的操作,非常消耗资源。如果使用多进程,那么并发数相对来说不会很高。而线程是更细小的调度单元,更加轻量级,所以线程会较为广泛的用于并发设计。在Java当中线程的概念和操作系统级别线程的概念是类似的。事实上,Jvm将会把Java中的线程...原创 2018-07-30 14:34:42 · 822 阅读 · 0 评论 -
Java并发编程(三)------线程组、守护线程和线程优先级
1. 线程组可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示:线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。线程组的activeCount()可以获得活动线程的总数,但由于线程是动态的,因此这个值只是一个估计值,无法确定精确,list()方法可以打印这个线程组中所有的线...原创 2018-07-30 15:06:44 · 329 阅读 · 1 评论 -
Java并发编程(四)------Java内存模型及原子性、有序性和可见性
Java内存模型Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。 此处的变量(Variables)与Java编程中所说的变量有所区别,它包括了实例字段、 静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题。 为了获得较好的执行效能,Java内存模型并没有限制执...原创 2018-07-30 16:30:13 · 365 阅读 · 0 评论 -
Java并发编程(二十一)------并发设计模式之不变模式
不变模式一个类的内部状态创建后,在整个生命期间都不会发生变化时,就是不变类 ,不变模式不需要同步 。创建一个不变的类:public final class Product { // 确保无子类 private final String no; // 私有属性,不会被其他对象获取 private final String name; // final保证属性不会被2次赋值 ...原创 2018-08-03 21:07:02 · 279 阅读 · 0 评论 -
Java并发编程(二十二)------并发设计模式之Future模式
参考文章:[高并发Java 七] 并发设计模式Future模式核心思想是异步调用 非异步:异步:第一次的call_return由于任务还没完成,所以返回的是一个空的。但是这个返回类似于购物中的订单,将来可以根据这个订单来得到一个结果。所以Future模式意思就是,“未来”可以得到,就是指这个订单或者说是契约,“承诺”未来就会给结果。1. Future模式简单...转载 2018-08-03 21:17:13 · 459 阅读 · 0 评论 -
Java并发编程(五)------volatile关键字和happen-before详解
1.volatile是什么?Java采用共享内存的方式实现消息传递,而共享内存需要依托于同步,Java提供了synchronized、volatile关键字实现同步,而volatile可以说是Java虚拟机提供的最轻量级的同步机制,此外volatile关键字还拥有一些额外的功能。当一个变量定义为volatile之后,它将具备两种特性:第一是保证此变量对所有线程的可见性,这里的“可见性”...原创 2018-07-30 20:33:51 · 828 阅读 · 0 评论 -
Java并发编程(六)------线程间的通信机制
参考博客:Java并发编程的艺术(六)——线程间的通信多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同。1. volatile、synchronized关键字关于volatile的详细介绍:volatile关键字1.1 如何实现通信?这两种方式都采用了同步机制实现多条线程间的数据通信。与其说是“通信”,倒不如说是“共享变量”来的恰当。当一个...原创 2018-07-30 21:06:50 · 254 阅读 · 0 评论 -
Java并发编程(二十三)------并发设计模式之生产者消费者模式
参考文章:Java实现生产者消费者问题与读者写者问题目录1. 生产者消费者问题1.1 wait() / notify()方法1.2 await() / signal()方法1.2.1 对synchronized的改进1.2.2 ReentrantLock类1.2.3 什么时候用 ReentrantLock 代替 synchronized1.2.4 Reentrant...转载 2018-08-04 10:25:26 · 230 阅读 · 0 评论 -
Java并发编程(七)-----线程安全的实现方法
了解了什么是线程安全之后,紧接着的一个问题就是我们应该如何实现线程安全,这听起来似乎是一件由代码如何编写来决定的事情,确实,如何实现线程安全与代码编写有很大的关系,但虚拟机提供的同步和锁机制也起到了非常重要的作用。1. 互斥同步互斥同步(Mutual Exclusion&Synchronization)是常见的一种并发正确性保障手段。 同步是指在多个线程并发访问共享数据时,保证共享数据在同...原创 2018-07-31 10:38:22 · 1087 阅读 · 0 评论 -
Java并发编程(八)------无锁与无锁类(原子操作类)
参考文章:[高并发Java 四] 无锁1. 无锁的概念无锁主要有两个特征:是无障碍的 保证有一个线程可以胜出与无障碍相比,无障碍并不保证有竞争时一定能完成操作,因为如果它发现每次操作都会产生冲突,那它则会不停地尝试。如果临界区内的线程互相干扰,则会导致所有的线程会卡死在临界区,那么系统性能则会有很大的影响。而无锁增加了一个新的条件,保证每次竞争有一个线程可以胜出,则解决了无障碍...原创 2018-07-31 12:26:33 · 1521 阅读 · 2 评论 -
Java并发编程(二十四)------ThreadLocal
1. ThreadLocal是用来解决什么问题?ThreadLocal 是线程的局部变量, 是每一个线程所单独持有的,其他线程不能对其进行访问, 通常是类中的 private static 字段,是对该字段初始值的一个拷贝,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。我们知道有时候一个对象的变量会被多个线程所访问,这时就会有线程安全问题,当然我们可以使用syncho...原创 2018-08-04 11:20:04 · 227 阅读 · 0 评论