java线程
文章平均质量分 60
colie_li
coding
展开
-
并发编程之Disruptor框架介绍和高阶运用
1.Disruptor是什么1.1技术背景LMAX是在英国注册并受到FCA监管(监管号码为509778)的外汇黄金交易所, LMAX架构是LMAX内部研发并应用到交易系统的一种技术。它之所以引起人们的关注,是因为它是一个非常高性能系统,这个系统是建立在JVM平台上,核心是一个业务逻辑处理器,官方号称它能够在一个线程里每秒处理6百万订单.一个仅仅部署在4台服务器上的服务,每秒向D...转载 2020-04-12 00:58:05 · 977 阅读 · 0 评论 -
jstack和线程dump分析
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式: jstack [-l][F] pid 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的转载 2016-11-18 17:10:31 · 3733 阅读 · 0 评论 -
AtomicIntegerArray
public class TestAtoimIntegerArrayDemo implements Runnable { private static final AtomicIntegerArray array = new AtomicIntegerArray(10); @Override public void run() { for (int i = 0; i < 100000;原创 2016-11-12 23:47:18 · 406 阅读 · 0 评论 -
AtomicIntegerFieldUpdater
让普通类中的某个属性变量也享受原子操作,主要接口://通过反射获取构建clazz这个类的fieldName属性原子操作器AtomicIntegerFieldUpdater.newUpdater(Class clazz,String fieldName) //操作方法,初次之外还有好多incrementAndGet();即通过下面demo,可以让Studen的Score属性具有C原创 2016-11-13 00:06:52 · 684 阅读 · 0 评论 -
ThreadAtomicStampedReference
public class ThreadAtomicStampedReference { static AtomicStampedReference money = new AtomicStampedReference(19,0); final static AtomicInteger at = new AtomicInteger(0); public static原创 2016-11-12 23:29:06 · 270 阅读 · 0 评论 -
thread的status详解
public static enum Thread.Stateextends Enum线程状态。线程可以处于下列状态之一: 1.NEW 至今尚未启动的线程的状态。 2.RUNNABLE 可运行线程的线程状态。处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。 3.BLOCKED 受阻塞并且正在等待监视器锁的某转载 2016-11-11 17:05:02 · 2471 阅读 · 0 评论 -
Master-Worker模式
简介 Master-Worker模式是常用的并行设计模式。它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程。Master进程负责接收和分配任务,Worker进程负责处理子任务。当各个Worker进程将子任务处理完后,将结果返回给Master进程,由Master进行归纳和汇总,从而得到系统结果。处理过程如下图:Master-Worker模式的好处是转载 2016-11-08 00:48:48 · 558 阅读 · 0 评论 -
AtomicStampedReference 与 AtomicInteger
如题两个类均为原子操作,是线程安全的 对于ABA的问题,由于普通的CAS在进行比较的时候是拿一个值和期望值进行比较是否一样,如果一样的话会做替换复制操作,不一样不会进行替换赋值操作。但是在使用中如果一个值被多个线程更改由A变成B在由B变成A,如果单纯去比较值的话CAS是可以通过的,但是对于一些的含有过程的业务场景来说这个是有问题,所以可以使用AtomicStampedRef原创 2016-01-14 00:35:19 · 1589 阅读 · 0 评论 -
解析java中volatile关键字
在java多线程编程中经常volatile,有时候这个关键字和synchronized 或者lock经常有人混淆,具体解析如下:在多线程的环境中会存在成员变量可见性问题: java的每个线程都存在一个线程栈的内存空间,该内存空间保存了该线程运行时的变量信息,当线程访问某一个变量值的时候首先会根据这个变量的地址找到对象的堆内存或者是栈堆存(原生数据类型)中的具体的内容,然后把这个内同赋值一个副本原创 2016-01-13 00:52:20 · 1271 阅读 · 1 评论 -
线程锁错误案例
在使用线程锁的时候对于一些不可变对象诸如String Integer等等可能会出现一些问题诸如下面代码:public class ThreadSync implements Runnable{ static ThreadSync sync = new ThreadSync(); static Integer j=0; public void inscane(){原创 2016-01-28 23:29:54 · 901 阅读 · 0 评论 -
TryLock使用方式
尝试获取锁,如果获取到了执行同步的地方,如果获取不到那么返回的是false将做其他的事情。public class TestTryLcok implements Runnable{ private static Lock locks = new ReentrantLock(); @Override public void run() { try {原创 2016-01-28 22:18:48 · 5365 阅读 · 0 评论 -
java线程安全问题之静态变量、实例变量、局部变量
java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。 此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则转载 2016-01-28 21:36:53 · 446 阅读 · 0 评论 -
LinkedBlockingQueue 与ConcurrentLinkedQueue
LinkedBlockingQueue add(Object obj) 添加元素到队列take()获取元素 会阻塞poll()不会阻塞的获取元素ConcurrentLinkedQueue高效的队列add(Object obj) 添加元素到队列poll()不会阻塞的获取元素原创 2016-01-28 19:17:16 · 620 阅读 · 0 评论 -
Future 模式详解
改模式的核心思想是异步调用。 在做应用开发时,有时会遇到一种场景:在完成某个主任务的同时,需要处理一些其它的子任务,为了加快响应速度,会将子任务放在另外的线程中执行。例如,搜索引擎在处理用户的查询请求时,不仅要从本地数据库查找匹配的结果,同时可能会向远程的广告服务器请求广告数据,最后将搜索结果和广告一起返回给用户。在这个例子中,主线程从本地查找搜索结果,同时启动子线程从远程原创 2016-01-27 17:21:54 · 1101 阅读 · 0 评论 -
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。注:什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同一代转载 2016-01-26 10:49:18 · 423 阅读 · 0 评论 -
ConcurrentLinkedQueue Demo
ConcurrentLinkedQueue 主要用于生产者消费者的模式的情景:public class Test { private static ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); private static CountDownLatch latch1 = new CountDownLatch原创 2016-01-26 10:46:39 · 755 阅读 · 0 评论 -
深入理解Java之线程池
原文点击在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?转载 2016-12-06 00:29:27 · 359 阅读 · 0 评论 -
java并发库 Lock 公平锁和非公平锁
jdk1.5并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,关于两者区别,java并发编程实践里面有解释公平锁: Threads acquire a fair lock in the order in which they requested it非公平锁:a nonfair lock permits barging: threads req...转载 2016-11-18 21:23:11 · 490 阅读 · 0 评论 -
阻塞队列使用方式详解
阻塞队列方法\处理方式抛出异常返回特殊值一直阻塞超时退出插入方法add(e)offer(e)put(e)offer(e,time,unit)移除方法remove()poll()take()poll原创 2016-06-15 15:16:59 · 2734 阅读 · 0 评论 -
使用fastjson时出现$ref: "$.list[2]"的解决办法(重复引用)
最近下做成绩分析的功能的时候,出现了$ref: "$.list[2]"的情况。然后我查了一下出现这种情况的原因和解决办法。出现$ref: "$.list[2]"的原因是因为循环引用/内存对象重复那么什么是重复/循环引用?简单说,重复引用就是一个集合/对象中的多个元素/属性同时引用同一对象,循环引用就是集合/对象中的多个元素/属性存在相互引用导致循环。举例说明重复引用Li...转载 2019-05-08 21:20:37 · 3155 阅读 · 0 评论 -
从源码讲解java线程池ThreadPoolExecuter的实现原理
线程池基本在每个应用中都会用到,而线程池涉及到的细节非常多,要想用好它,仅仅是了解它的api调用是不行的,而且如果你经常分析java线程堆栈,不了解线程池,那么涉及到线程池堆栈的代码也很难看懂,所以作为java程序员,应该好好研究下线程池的实现!类结构图示例public class ThreadPoolTest { //固定大小的线程池: //初始化一个转载 2018-04-05 21:34:54 · 2418 阅读 · 0 评论 -
源码解读线程池原理
线程池线程池线程池概述创建一个线程池并提交线程任务线程池源码解析参数认识构造方法提交任务addWorker执行任务关闭线程池线程池概述什么是线程池为什么使用线程池线程池的优势第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。第三:...转载 2018-04-05 21:28:40 · 214 阅读 · 0 评论 -
happens-before俗解
学习Java并发,到后面总会接触到happens-before偏序关系。初接触玩意儿简直就是不知所云,下面是经过一段时间折腾后个人对此的一点浅薄理解,希望对初接触的人有帮助。如有不正确之处,欢迎指正。synchronized、大部分锁,众所周知的一个功能就是使多个线程互斥/串行的(共享锁允许多个线程同时访问,如读锁)访问临界区,但他们的第二个功能 —— 保证变量的可见性 —— 常被遗忘。转载 2018-04-05 21:14:55 · 304 阅读 · 0 评论 -
java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
之前做过一个测试,详情见这篇文章《多线程 +1操作的几种实现方式,及效率对比》,当时对这个测试结果很疑惑,反复执行过多次,发现结果是一样的: 1. 单线程下synchronized效率最高(当时感觉它的效率应该是最差才对); 2. AtomicInteger效率最不稳定,不同并发情况下表现不一样:短时间低并发下,效率比synchronized高,有时甚至比LongAdder还高出一点,但是转载 2018-04-04 17:38:28 · 178 阅读 · 0 评论 -
深入理解synchronized实现原理
认识synchronized对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方价格synchronized基本上就搞定 了,如果说不考虑性能问题的话,这一操绝对能应对百分之九十以上的情况,若对于性能方面有要求的话就需要额外的知识比如读写锁等等。本文目的先了解透彻synchronized的基本原理。Synchronized的基本使用Synchronized的作用...原创 2018-03-30 16:08:21 · 292 阅读 · 0 评论 -
jstack常规排查问题方式
常规问题排查方式在多线程程序中,如果出现的问题是数据异常类的问题,比较难排查需要一点点的检查代码。如果说是资源类的问题排查起来相对来说比较简单。常用的命令就是 top/jps 以及ps 定位出是哪个进程。然后通过jstack命令打出这个进程的全部线程堆栈,接下来就是分析打印的堆栈信息了。在堆栈信息里面打印的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable ...原创 2018-03-15 15:59:30 · 1009 阅读 · 0 评论 -
一篇简短文章搞定java线程池
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为线程的创建和销毁是比较耗费系统资源的。 在Java中可以通过线程池来解决上述的问题。今天先来讲解下最核心的ThreadPoolExecutor线程池类,最后通过一个流程图彻底了解Th...原创 2018-03-08 11:33:51 · 167 阅读 · 0 评论 -
深入理解java线程池
1.Runable、Callable、Future、Futuretask (1)、Runable 实现Runable接口,覆写run方法,创建线程。 (2)、Callable 实现Callable接口,覆写call方法,创建一个带返回值的线程。 (3)、Future是一个异步计算的控制接口,可以获取返回值和取消执行的任务 (4)、FutureTask是Future的一个实现,主要用于做线程...转载 2017-10-17 12:12:51 · 348 阅读 · 0 评论 -
全面解析schedule、scheduleAtFixedRate和scheduleWithFixedDelay
通过java在做定时任务的时候最好使用scheduleThreadPoolExecutor的方式,因为这样可以保证里面始终以后线程是活的。scheduleThreadPoolExecutor有三种任务执行的方式:scheduleAtFixedRate、scheduleWithFixedDelay、schedule原创 2017-06-20 15:46:24 · 24034 阅读 · 0 评论 -
深入理解Lock的底层实现原理
lock的实现完全是由java写的,和操作系统或者是JVM虚拟机没有任何关系。整体来看Lock主要是通过两个东西来实现的分别是CAS和ASQ(AbstractQueuedSynchronizer)。通过加锁和解锁的过程来分析锁的实现。加锁一、整体概述流程1. 读取表示锁状态的变量2. 如果表示状态的变量的值为0,那么当前线程尝试将变量值设置为1(通过CAS操作完成),当多个线程原创 2017-01-22 23:58:05 · 13153 阅读 · 1 评论 -
深入理解voildate
对于被voildate修饰过的变量大部分人都知道当一个线程修改过后对另外一个线程可见,具体是为什么资料的讲解比较少,通过读并发编程的艺术对voildate变量的原理机制做下总结。 对于voildate变量来讲是有两个语义的,一个是可见性问题,另外一个是禁止指令重排。 1、可见性问题 相对于内存,CPU的速度是极高的,如果CPU需要存取数据时都直接与内存打交道,在存取过原创 2017-01-22 13:37:45 · 984 阅读 · 0 评论 -
ReentrantLock 实现原理深入探究
前言这篇文章被归到Java基础分类中,其实真的一点都不基础。网上写ReentrantLock的使用、ReentrantLock和synchronized的区别的文章很多,研究ReentrantLock并且能讲清楚ReentrantLock的原理的文章很少,本文就来研究一下ReentrantLock的实现原理。研究ReentrantLock的实现原理需要比较好的Java基础以及阅读代码的能力,有原创 2017-01-20 11:27:38 · 487 阅读 · 1 评论 -
Future 返回list
ExecutorService pool = Executors.newFixedThreadPool(3); List> list = Lists.newArrayList(); for(int i=0;i<4;i++){ Future submit = pool.submit(new Callable() {原创 2017-02-19 01:32:10 · 3313 阅读 · 0 评论 -
ConcurrentLinkedQueue使用方法
它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最近加入的。插入元素是追加到尾上。提取一个元素是从头提取。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。该队列不允许null元素。此实现采用了有效的“无等待 (wait-free)”算法,该算法基于 Maged M. Michael 和转载 2016-01-26 10:38:01 · 31041 阅读 · 0 评论 -
Java线程池的分析和使用
1. 引言合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指转载 2016-01-25 10:24:15 · 453 阅读 · 0 评论 -
Java 线程池的原理与实现
最近在学习线程池、内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享。[分享]Java 线程池的原理与实现这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧。线程池就是其中之一,一提到线程,我们会想到以前《操作系统》的生产者与消费者,信号量,同步控制等等。一提到池,我们会转载 2015-01-17 17:43:19 · 515 阅读 · 1 评论 -
java线程池
构建一个线程池,可以在池中创建对个线程,用这个线程池去处理事情,会根据实际情况有线程池中的线程分配处理。public class TestThreadPool { public static void main(String[] args) { //ExecutorService ec = Executors.newFixedThreadPool(3);//固定线程数 //E原创 2015-01-17 17:03:32 · 617 阅读 · 0 评论 -
CountDownLatch
CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行CountDownLatch如其所写,是一个倒计数的锁存器,当计数减至0时触发特定的事件。利用这种特性,可以让主线程等待子线程的结束。下面以一个模拟运动员比赛的例子加以说明。原创 2015-01-18 17:20:34 · 492 阅读 · 0 评论 -
Java多线程-新特征-信号量Semaphore
简介信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。概念Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的原创 2015-01-18 03:26:24 · 498 阅读 · 0 评论 -
Java多线程-工具篇-BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个转载 2015-01-17 19:15:56 · 538 阅读 · 0 评论