Java多线程
文章平均质量分 85
介绍java多线程的相关知识
白夜行515
世界上有两样东西不能直视:一是太阳,二是人心!
展开
-
【Java多线程】Volatile关键字详解
预备知识1..内存模型通过缓存一致性协议来保证一致性。最出名的就是Intel 的MESI协议,MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重原创 2017-06-19 16:39:52 · 517 阅读 · 0 评论 -
【java多线程】CountDownLatch与CyclicBarrier
CountDownLatch 闭锁1.引入Java 5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。2.定义CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。3.闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行:(1)确保某个计算在其需要的原创 2017-06-19 20:29:14 · 466 阅读 · 0 评论 -
【Java多线程】Synchronized详解
引入我们先来看一个小例子public class CreatRunnable { public static void main(String[] args) { //定义售票窗口 TicketWindow ticket = new TicketWindow(); Thread t1 = new Thread(tic原创 2017-06-19 12:50:06 · 959 阅读 · 0 评论 -
【Java多线程】并发容器Collections
1.迭代器与ConcurrentModificationException使用Iterator迭代容器或使用使用for-each遍历容器,在迭代过程中修改容器会抛出ConcurrentModificationException异常。想要避免出现ConcurrentModificationException,就必须在迭代过程持有容器的锁。但是若容器较大,则迭代的时间也会较长。那么需要访问该容器的其他线原创 2017-06-20 10:04:47 · 633 阅读 · 0 评论 -
【Java多线程】ForkJoinPool
1.定义Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架2.与线程池的区别(1)采用工作窃取模式(work-stealing):某个线程从其他队列里窃取任务来执行。为了减少窃取任务线程和被 窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务线程永远从自己双端队列的头部拿 任务执行,而窃取任务的线原创 2017-06-20 18:27:03 · 910 阅读 · 0 评论 -
【Java多线程】线程池的工作原理详解(上)
为什么使用线程池线程池为线程生命周期开销问题和资源不足问题提供了解决方案,因为线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控;多线程技术可以解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力;什么时候使用线程池需要大量的线程来完成任务,且完成任务的时间比较短,如WEB服原创 2017-06-20 17:18:23 · 2516 阅读 · 1 评论 -
【Java多线程】线程池的工作原理详解(下)
接着上篇文章,我接下来继续介绍线程池的工作原理,如果你还没有看上篇,我建议最好浏览一下:线程池的工作原理详解(上)Executors 工具类 1.定义Executors是java线程池的工厂类,通过它可以快速初始化一个符合业务需求的线程池。2.常用方法(1) newFixedThreadPool方法 :创建固定大小的线程池适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场景,即负载比较原创 2017-06-20 17:27:56 · 1436 阅读 · 0 评论 -
【Java多线程】生产者消费者模式
定义生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。图解:实例public class ProductorAndConsumerTest { pub原创 2017-06-19 15:12:56 · 430 阅读 · 0 评论 -
【Java多线程】ReentrantReadWriteLock详解
1.定义ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有writer,读取锁可以由多个reader 线程同时保持。写入锁是独占的。2.适用性ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含原创 2017-06-19 20:57:15 · 340 阅读 · 0 评论 -
【Java多线程】ReentrantLock与Condition详解
ReentrantLock 与synchronized异同1.引入经过之前的学习,你肯定知道锁就用synchronized,但今天我再介绍一种锁-Lock2.底层实现synchronized是基于JVM层面实现的,而Lock是基于JDK层面实现的3.使用lock不仅要上锁还要释放锁,如果忘记释放锁就会产生死锁的问题,所以,通常需要在finally中进行锁的释放。但是synchronized的使用十分原创 2017-06-19 19:56:38 · 472 阅读 · 0 评论 -
【Java多线程】CAS算法
1.引入(1)在JDK1.5之前。Java主要靠synchronized这个关键字保证同步,已解决多线程下的线程不安全问题,但是这会导致锁的发生,会引发一些个性能问题。(2)锁主要存在一下问题在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。一个线程持有锁会导致其它所有需要此锁的线程挂起。如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风原创 2017-06-19 17:22:12 · 511 阅读 · 0 评论 -
【Java多线程】原子类
1.定义java.util.concurrent.atomic这个包里面提供了一组原子类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。实际上是借助硬件的相关指令(CAS)来实现原创 2017-06-19 18:54:04 · 452 阅读 · 0 评论 -
【Java多线程】概述
线程与进程的异同1.定义进程:操作系统可以同时执行多个任务,每个任务就是进程; 线程:进程的执行单元,也是进程内的可调度实体。2.线程与进程的关系 一个程序运行后至少有一个进程,一个进程可以拥有多个线程,但至少要包含一个 线程(主线程,即Java中的main()方法执行后的线程)。一个线程必须有一个父进程,线程的调度和管理由进程本身完成。3.线程与进程的区别地址空间:进程内的一个执行单元,原创 2017-06-19 10:37:25 · 440 阅读 · 0 评论 -
【Java多线程】死锁范例及解决办法
1.定义两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行2.产生的原因系统资源的竞争系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。进原创 2017-06-19 14:43:49 · 810 阅读 · 0 评论 -
【Java多线程】ThreadLocal实现原理
1.常用API 方法 描述 int activeCount() 返回当前线程的线程组中活动线程的数目 Thread currentThread() 返回对当前正在执行的线程对象的引用 int enumerate(Thread[] tarray) 将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中 ThreadGroup getThreadGroup()原创 2017-06-19 11:25:22 · 518 阅读 · 0 评论