
多线程
xiaoliuliu2050
这个作者很懒,什么都没留下…
展开
-
jstack生成的Thread Dump日志线程状态解析
Thread Dump日志的线程信息以下面的日志为例:"resin-22129" daemon prio=10 tid=0x00007fbe5c34e000 nid=0x4cb1 waiting on condition [0x00007fbe4ff7c000] java.lang.Thread.State: WAITING (parking) at sun.misc.Un...原创 2019-10-25 14:24:53 · 584 阅读 · 0 评论 -
java线程池ThreadPoolExecutor源码解析
线程池中几个参数的作用和线程池大体的工作原理:一.线程池的构造方法ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ...转载 2019-02-22 18:18:47 · 255 阅读 · 0 评论 -
spring 多线程-线程池:
1 类介绍 :一: ThreadPoolTaskExecutor是一个spring的线程池技术,查看代码可以看到这样一个字段: private ThreadPoolExecutor threadPoolExecutor; 可以发现,spring的 ThreadPoolTaskExecutor是使用的jdk中的java.util.concurrent.ThreadPo...原创 2016-04-22 18:48:53 · 2307 阅读 · 0 评论 -
Tomcat 的连接数与线程池 和io
前言在使用tomcat时,经常会遇到连接数、线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接(Connector)。在前面的文章 详解Tomcat配置文件server.xml 中写到过:Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine(也就是Servlet容器)来处理这个请求,并把产...转载 2019-03-07 16:45:40 · 393 阅读 · 0 评论 -
java 数据结构之 map 多线程实现 concurrentSkipListMap 源码解析
什么是跳表 :https://blog.csdn.net/xiaoliuliu2050/article/details/73230494Key-Value数据结构目前常用的key-value数据结构有三种:Hash表、红黑树、SkipList,它们各自有着不同的优缺点(不考虑删除操作):Hash表:插入、查找最快,为O(1);如使用链表实现则可实现无锁;数据有序化需要显式的排序操作。红...转载 2019-03-08 17:07:09 · 383 阅读 · 0 评论 -
java ThreadPoolExecutor 线程池五种状态转化
线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。线程池各个状态切换框架图:1、RUNNING(1) 状态说明:线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。(02) 状态切换:线程池的初始化状态是RUNNING。换句话说,线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0!...转载 2019-03-06 18:01:15 · 1269 阅读 · 0 评论 -
java数据结构之并发队列中的阻塞队列 BlockingQueue 接口实现之 ArrayBlockingQueue
可以先了解 blocking ,查看https://blog.csdn.net/xiaoliuliu2050/article/details/88314959阻塞队列原理:其实阻塞队列实现阻塞同步的方式很简单,使用的就是是lock锁的多条件(condition)阻塞控制。使用BlockingQueue封装了根据条件阻塞线程的过程,而我们就不用关心繁琐的await/signal操作了。...原创 2017-06-27 20:44:22 · 273 阅读 · 0 评论 -
java数据结构之并发队列中的阻塞队列 BlockingDeque 接口实现之 LinkedBlockingDeque
1 双向并发阻塞队列。所谓双向是指可以从队列的头和尾同时操作,并发只是线程安全的实现,阻塞允许在入队出队不满足条件时挂起线程,这里说的队列是指支持FIFO/FILO实现的链表。首先看下LinkedBlockingDeque的数据结构。通常情况下从数据结构上就能看出这种实现的优缺点,这样就知道如何更好的使用工具了。从数据结构和功能需求上可以得到以下结论:要想支持阻塞功能,队列的容...转载 2019-03-07 17:29:29 · 231 阅读 · 0 评论 -
java 数据结构之 并发队列 之Queue 接口实现类 ConcurrentLinkedDeque 源码解析
private void linkFirst(E e) { checkNotNull(e); final Node<E> newNode = new Node<E>(e); restartFromHead: for (;;) for (Node<E> h = head, p = h, q;;) { ...原创 2019-03-07 17:32:08 · 406 阅读 · 0 评论 -
java数据结构之并发队列中的阻塞队列 BlockingQueue 接口概述
阻塞队列 (BlockingQueue)是Javautil.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。BlockingQueue 的...原创 2019-03-07 17:41:09 · 212 阅读 · 0 评论 -
java 多线程之线程状态划分
一、线程的状态此外 还有一个流程就是 runing 的线程,如果调用yield方法,也会变成runnable ,但是不会释放锁。线程间的状态转换:1.新建(new):至今尚未启动的线程的状态。线程刚被创建,但尚未启动。2.可运行(runnable):线程正在JVM中执行,调用了该对象的start()方法,有可能在等待操作系统中的其他资源,比如处理器。3....原创 2019-09-09 16:28:27 · 373 阅读 · 0 评论 -
提高吞吐率之 异步处理 DeferredResult Callable WebAsyncTask
springmvc 支持异步处理来提高吞吐率 ,什么时候适合用这三种方式呢?主要是 在 nio worker 线程数 都被占满的情况下 ,也无法满足并发请求的需求的时候,这个时候应该都是接口响应时间过长。主要支持3种方式在我们的实际生产中,常常会遇到下面的这种情况,某个请求非常耗时(大约5s返回),当大量的访问该请求的时候,再请求其他服务时,会造成没有连接使用的情况,造成这种现...原创 2019-09-09 17:52:01 · 1202 阅读 · 0 评论 -
Java并发Concurrent 之fork/join 框架学习
1 fork/join 框架包括多个类1 ForkJoinPool 线程池类 , 2 ForkJoinTask 任务类任务子类有2种//有返回值public abstract class RecursiveTask<V> extends ForkJoinTask<V> {}//无返回值public abstract class Recursi...原创 2019-09-10 12:43:39 · 388 阅读 · 0 评论 -
java 并发 之深入浅出parallelStream
about Stream什么是流?Stream是java8中新增加的一个特性,被Java猿统称为流.Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大...转载 2019-09-10 15:33:03 · 1017 阅读 · 0 评论 -
java 并发 之深入浅出parallelStream 坑的解决
替换默认的共享线程池ForkJoinPool.commonPool()Java 8 的并行流可以让我们相对轻松地执行并行任务。myList.parallelStream.map(obj -> longRunningOperation())但是这样存在一个严重的问题:在 JVM 的后台,使用通用的 fork/join 池来完成上述功能,该池是所有并行流共享的。默认情况,fo...转载 2019-09-10 15:36:39 · 4235 阅读 · 0 评论 -
线程执行 之 Executors工具类介绍
Executors是一个工具类,提供了大量的静态方法,方便我们在线程池中使用。 static Callable<Object> callable(Runnable task):将runnable接口实例转换成Callable接口实例.static ExecutorService newCacheThreadPool():创建一个“按需创建”的线程池,此前创建的线程可用时将重用它们。...转载 2019-02-22 17:40:38 · 366 阅读 · 0 评论 -
线程执行 之 ExecutorService.submit()方法执行内部逻辑解析 ThreadPoolExecutor
futureTask 继承了Runable 接口,所以本身就是一个线程,内部实现了run方法,当主线程使用ExecutorService.submit ()方法提交任务或者使用 futureTask.start() 启动子线程的时候,开始执行futuretask的run 方法,run 方法内部 调用了 Callable 接口的call方法 ,然后这个线程慢慢执行的过程中, 主线程执行完其他操作,调...原创 2019-02-22 17:18:33 · 2347 阅读 · 0 评论 -
SimpleDateFormat 使用注意事项
SimpleDateFormat类的继承关系:java.text Class SimpleDateFormatjava.lang.Object | +----java.text.Format | +----java.text.DateFormat| +----java.text.SimpleDateFormat转载 2017-07-27 11:33:29 · 898 阅读 · 0 评论 -
线程执行 之 Runnable Callable Future ,FutureTask ExcutorService概览
Runnable 和Callable接口的区别线程的创建方式中有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,于是就有了Callable接口,Future接口与FutureTask类的配合取得返回的结果。我们先回顾一下java.lang.Runnable接口,就声明了run(),其返回值为void,当然就...原创 2018-07-17 17:21:51 · 400 阅读 · 0 评论 -
java多线程协作之CountDownLatch (线程等待其他一个或者多个线程执行完毕之后开始执行)
CountDownLatch简介CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch和CyclicBarrier的区别(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。(02) CountDownLatch的计数...转载 2017-06-30 15:09:29 · 558 阅读 · 0 评论 -
多线程协作之 CyclicBarrier (多个线程之间相互等待, 都到了之后继续执行或者另外一个线程开始执行)
CyclicBarrier简介CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。注意比较CountDownLatch和CyclicBarrier:(01) CountDownLatch的作用是允许1或N个线程等待其他线程...转载 2017-06-30 15:12:03 · 490 阅读 · 0 评论 -
java 多线程-中断机制 interrupt(),isInterrupted()和interrupted()
中断的作用:如果线程A正在阻塞,线程B 想要提前结束线程A 的 阻塞状态,则可以通过中断机制来做通知。java 中断依赖于3个方法,interrupt(),isInterrupted()和interrupted()。中断状态为true和falseinterrupt() 设置中断状态为true。 A中调用线程B的interrupt()方法,即会向线程B发出信号(线程中断状态已被设置),...原创 2018-12-14 13:23:35 · 967 阅读 · 0 评论 -
java多线程协作方法之 wait notify condition 的理解
java 多线程协作肯定因为共享对象,实现原理是基于线程挂起和线程恢复。wait notify condition 都是 基于锁对象产生的衍生方法,多线程之间可以依靠这些方法实现线程协作。synchronized 的锁原理是在共享对象头里添加标记和对象监控器,这些都是jvm 内部实现的。而 lock 的锁原理是 独立于共享对象之外 新建一个锁监控对象(锁对象就类似于synchroniz...原创 2018-12-18 11:16:13 · 479 阅读 · 0 评论 -
java 多线程协作 Semaphore 信号量
Semaphore简介Semaphore是一个计数信号量,它的本质是一个"共享锁"。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。Semaphore的函数列表// 创建具有给定的许可数和非公平的公平设...转载 2017-06-30 15:14:03 · 453 阅读 · 0 评论 -
AbstractQueuedSynchronizer(AQS) 源码详解
这个系列文章打算用图解的方式记录了自己阅读concurrent包的中一些类的大概流程,加深印象。JDK版本我这里依据的JDK版本如下:java version "1.8.0_73"Java(TM) SE Runtime Environment (build 1.8.0_73-b02)Java HotSpot(TM) 64-Bit Server VM (build 25.73-b0...转载 2018-12-26 13:34:26 · 315 阅读 · 0 评论 -
java保证多线程安全的一种机制 : volatile 关键字
有时仅仅为了读写一个或者两个实例域就使用同步的话,显得开销过大,volatile关键字为实例域的同步访问提供了免锁的机制。如果声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的。volatile 关键字的使用场景:多线程环境中,只共享一个标志位。 如果线程A 修改了这个标志位,需要线程B能够及时获取到更新的值,这种情况下要使用volatile关键字。如果...转载 2018-12-26 15:36:27 · 772 阅读 · 0 评论 -
java 锁和内存重排序
指令重排导致单例模式失效我们都知道一个经典的懒加载方式的单例模式:public class Singleton {private static Singleton instance = null;private Singleton() { }public static Singleton getInstance() {if(instance == null) {synch...转载 2018-12-26 15:57:18 · 293 阅读 · 0 评论 -
java保证多线程安全的一种机制 : 原子类介绍 atomic
volatile 保证了可见性和有序性 ,不保证原子性,并且没有对变量加锁原子类 对volatile 做了封装,是一种 支持 原子性的 类库,并且没有对变量加锁。他是如何保证原子性呢,他是通过cas 操作和while 循环 来做到的。atomic原子类导图1 原子更新基本类型atomic包提高原子更新基本类型的工具类,主要有这些:AtomicBoolean:以原子...原创 2018-12-26 18:14:06 · 3190 阅读 · 1 评论 -
Java并发Concurrent技术进化概述
1.JDK1.4及之前在JDK1.4及之前的版本,主要提供的并发技术有:synchronized关键字volatile关键字不变模式 :不变模式,就是指:在并发编程中,为确保数据的一致性和正确性,使用一种不可改变的对象。依靠其不可变的性质,来确保在没有同步的情况下依旧保持一致性和正确性。Java中不变模式相关技术有:final关键字 和String类型常用的工具类 : hashtab...原创 2019-01-03 10:03:03 · 205 阅读 · 0 评论 -
jdk5 juc java并发中的集合类list set map queue概述
1. List和SetJUC集合包中的List实现类:CopyOnWriteArrayListset 实现类 CopyOnWriteArraySet和ConcurrentSkipListSet。(01)CopyOnWriteArrayList相当于线程安全的ArrayList,它实现了List接口。CopyOnWriteArrayList是支持高并发的。(02)Co...原创 2019-01-03 10:02:53 · 288 阅读 · 0 评论 -
线程执行 之FutureTask 原理 (线程通知)
先看一个例子 static class Task implements Callable<Integer> { @Override public Integer call() throws Exception { System.out.println("子线程在进行计算"); Thread.s...原创 2019-02-22 16:17:07 · 598 阅读 · 2 评论 -
保证多线程安全的一种机制 : ThreadLocal
想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其...原创 2017-06-29 09:41:06 · 367 阅读 · 0 评论