Java并发和多线程操作
文章平均质量分 67
攻城狮Luke(刘健彬)
在深圳某IOT企业任职技术专家,擅长的技术领域包括Spring Cloud、Spring Cloud Alibaba、微服务架构、Docker、Kubernetes、分布式事务、高并发多线程、消息队列、数据库、数据结构与算法、网络数据安全、JVM、DevOps等,拥有丰富的互联网一线开发与架构经验。开源分布式事务框架milo作者,CSDN知名博主。
展开
-
java多线程之并发框架Disruptor
java多线程之并发框架Disruptor什么是DisruptorDisruptor的特性Disruptor入门例子例子结果参考什么是DisruptorDisruptor是一个高性能的无锁线程间通讯框架,作者英国LMAX公司,其用于自己一种新型零售金融交易平台,它能够以很低的延迟产生大量交易,这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻...原创 2019-08-30 15:51:55 · 1011 阅读 · 0 评论 -
java多线程之线程池执行器
package com.np.ota.test.executor;import java.util.Date;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;impo...原创 2018-03-14 11:47:47 · 315 阅读 · 0 评论 -
使用无限大小线程池 newCachedThreadPool 可能遇到的问题
package com.wenniuwuren.concurrent; import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; /** * Created by zhuyb on 16/6/16. */public class newCachedThreadPoolTest...转载 2018-03-14 10:03:53 · 3593 阅读 · 1 评论 -
java多线程之CyclicBarrier
一、简介CyclicBarrier也是一个同步辅助类,作用和CountDownLatch几乎一模一样,并没有多大区别,CyclicBarrier是向上记数,CountDownLatch是向下技术。CyclicBarrier和CountDownLatch的区别就是前者计数可以重置。使用CyclicBarrier同样可以实现CountDownLatch能实现的问题。只是CyclicBarrier由于构...原创 2018-03-13 15:25:31 · 414 阅读 · 0 评论 -
java多线程之分治技术框架Fork/Join
一、Fork/Join框架用来解决能够通过分治技术将问题拆分成小任务的问题。例如某商城需要统计1百万个用户的消费总金额,如果采用顺序执行,一个一个去计算用户的消费金额,然后再合并计算,那么将非常耗时。此时可以用Fork/Join分治技术很好的实现多任务并行计算用户的消费金额,节省大量的时间。(但将消耗更多的资源)二、Fork/Join框架之RecursiveAction(没有返回结果的任...原创 2018-03-23 09:26:08 · 572 阅读 · 0 评论 -
java多线程之CountDownLatch(2)(和join进行比较)
首先,我们来看一个应用场景1:假设一条流水线上有三个工作者:worker0,worker1,worker2。有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0和worker1完成了他们的工作,而worker0和worker1是可以并行他们各自的工作的。如果我们要编码模拟上面的场景的话,我们大概很容易就会想到可以用join来做。当在当前线程中调用某个线程 th...转载 2018-03-13 11:45:04 · 399 阅读 · 0 评论 -
java多线程之CountDownLatch(1)(模拟高并发和开会问题)
一、简介CountDownLatch 是 java.util.concurrent 包下的一个同步辅助类,它能使一个或多个线程在其他的线程的一系列操作完成之前一直等待,初始化值为计数器大小(即线程数量)。二、使用场景同时启动多个线程; 多个线程操作完成之前一直等待。注:此处“同时”只能是“大约同时”,涉及到每个线程是否可以分配到一个自由的处理器,系统是否繁忙,线程释放CPU的速度,...转载 2018-03-13 11:42:09 · 1118 阅读 · 0 评论 -
java多线程之线程池执行器2(callable)
一、线程池执行器可以执行有结果返回的任务,称为callable任务。执行方式有三种: (1) executor.submit(); (2) executor.invokeAny(); (3) executor.invokeAll();二、executor.submit();package com.np.ota....原创 2018-03-16 09:34:02 · 258 阅读 · 0 评论 -
Java多线程技术之Semaphore(信号量)
Semaphore的作用:在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解决多个线程并发同一资源造成的数据不一致的问题。在另外一种场景下,一个资源有多个副本可供同时使用,比如打印机房有多个打印机、厕所有多个坑可供同时使用,这种情况下,Java提供了另外的并发访问控制--资源...原创 2018-03-08 15:53:09 · 208 阅读 · 0 评论 -
ScheduledExecutorService中,scheduleAtFixedRate和scheduleWithFixedDelay的区别
我们通过运行代码来查看两者之间的区别:1、首先创建一个需要执行5秒的任务:[java] view plain copy// 执行这个任务需要5秒 Runnable runnable = new Runnable() { public void run() { int i = 5; while (i != 0) { try {...转载 2018-03-14 11:52:37 · 260 阅读 · 0 评论 -
java多线程之测试并发(1)-监控Lock
一、Lock是java并发同步代码块的工具之一。我们可以通过监控Lock知道哪个线程获取到了锁,哪个线程释放了锁,那些线程正在等待锁。二、监控Lockpackage com.np.ota.test.synctest.lock;import java.util.Collection;import java.util.concurrent.locks.ReentrantLock;/** *...原创 2018-03-27 10:14:41 · 364 阅读 · 0 评论 -
java多线程之volatile
内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。 为了能比较清晰彻底的理解volatile,我们一步一步来分析。首先来看看...转载 2018-07-19 10:31:35 · 176 阅读 · 0 评论 -
java多线程之wait和notify
1. 使用注意事项1、永远在synchronized的函数或对象里使用wait、notify和notifyAll,不然Java虚拟机会生成IllegalMonitorStateException。2、永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠前后都检查wait的条件,并在条件实际上并未改变的情况下处理唤醒通知。3、永远在多线程间共享的对象上使用wait。4...转载 2019-05-13 15:05:59 · 173 阅读 · 0 评论 -
java多线程之ConcurrentLinkedQueue
一、简介一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。二、例子...原创 2019-04-23 10:30:54 · 1157 阅读 · 0 评论 -
java多线程之ThreadLocal
一、ThreadLocal概念ThreadLocal的实例代表了一个线程局部的变量,每条线程都只能看到自己的值,并不会意识到其它的线程中也存在该变量。二、ThreadLocal例子/** * 使用ThreadLocal是为了使得代码看起来更加优雅 * 其实可以通过在每个线程里面new对象分别计算, * 但是因为这些操作是重复的,而且因为是各自线程内部变量(new 对象进行...原创 2019-04-22 18:05:48 · 172 阅读 · 0 评论 -
Java多线程之原子操作类
一、原子操作类原子操作类有三大类:(1)基本类型,有AtomicInteger、AtomicLong、AtomicBoolean,(2)数组类型,AtomcixxxArray,(3)引用类型,AtomicReference二、例子import java.util.concurrent.atomic.AtomicIntegerArray;import java.util.con...原创 2019-04-22 15:00:07 · 210 阅读 · 0 评论 -
java支持的四种I/O模型
同步、异步、阻塞、非阻塞都是和I/O(输入输出)有关的概念,最简单的文件读取就是I/O操作。而在文件读取这件事儿上,可以有多种方式。本篇会先介绍一下I/O的基本概念,通过一个生活例子来分别解释下这几种I/O模型,以及Java支持的I/O模型。基本概念在解释I/O模型之前,我先说明一下几个操作系统的概念文件描述符fd文件描述符(file descriptor)是计算机科学中的一个...转载 2018-12-29 15:21:52 · 420 阅读 · 0 评论 -
Java多线程之ThreadPoolExecutor
为什么用线程池博客地址 http://blog.csdn.net/qq_25806863原文地址 http://blog.csdn.net/qq_25806863/article/details/71126867有时候,系统需要处理非常多的执行时间很短的请求,如果每一个请求都开启一个新线程的话,系统就要不断的进行线程的创建和销毁,有时花在创建和销毁线程上的时间会比线程真正执行的时间还...转载 2018-11-23 10:20:29 · 359 阅读 · 0 评论 -
java多线程之并发集合(BlockingQueue)
简介 实现package com.np.ota.test.queue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.TimeUnit;public class BlockQueue...原创 2018-11-05 15:57:00 · 657 阅读 · 0 评论 -
java多线程之并发集合(CopyOnWriteArrayList)
CopyOnWriteArrayList:CopyOnWriteArrayList这是一个ArrayList的线程安全的变体,其原理大概可以通俗的理解为:初始化的时候只有一个容器,很常一段时间,这个容器数据、数量等没有发生变化的时候,大家(多个线程),都是读取(假设这段时间里只发生读取的操作)同一个容器中的数据,所以这样大家读到的数据都是唯一、一致、安全的,但是后来有人往里面增加了一个数据,这个时...转载 2018-11-05 15:25:12 · 1959 阅读 · 0 评论 -
ConcurrentMap线程安全的正确用法
import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import java.util.concurrent.ExecutionException;public class原创 2017-11-28 15:35:14 · 9120 阅读 · 0 评论 -
40个Java多线程问题总结
前言这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。40个问题汇总1、多线程有什么用?一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管转载 2017-02-10 13:56:20 · 400 阅读 · 1 评论 -
使用ThreadLocalRandom产生并发随机数
Java 7之前我们使用Math.random()产生随机数,使用原子变量来保存当前的种子,这样两个线程同时调用序列时得到的是伪随机数,而不是相同数量的两倍。ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。ThreadLocalRandom不是直接用new实例化,而是第一次使用其静态方法current()。从Math.r转载 2016-03-23 09:34:18 · 2432 阅读 · 0 评论 -
DelayQueue 队列
DelayQueue----一种有序队列,特点就是只有在队列中的元素到期后才能取出。 1.内存中哪些对象到了超时时间,需要从内存中清除出去。 2.服务器连接中有哪些连接很长时间未操作,需要关闭这些连接 3.任务中有哪些到了执行时间,该进行调度了。简单的方法就是写一个线程不断去检查每转载 2016-03-22 10:01:38 · 1078 阅读 · 0 评论 -
阻塞式线程安全列表
import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.TimeUnit;public class Client implements Runnable { private LinkedBlockingDeque list; public Client(LinkedBlockingDe原创 2016-03-21 12:17:31 · 464 阅读 · 0 评论 -
非阻塞式线程安全列表
import java.util.concurrent.ConcurrentLinkedDeque;public class AddTask implements Runnable { private ConcurrentLinkedDeque list; public AddTask(ConcurrentLinkedDeque list) { this.list = list;原创 2016-03-21 12:12:19 · 482 阅读 · 0 评论 -
张老师:Condition多路例子
简介Lock的作用就相当于synchronized,使用Lock就不需要使用synchronized,相反同理。使用synchronized时等待和唤醒使用的是object.await()和object.notify();使用Lock时使用等待和唤醒使用的是condition.await()和condition.signal();Lock和synchronized的区别在于前者可以原创 2016-04-01 10:35:38 · 733 阅读 · 0 评论 -
张老师:java读写锁
简介 ReadWriteLock(读写锁),为我们提供了在某些并发访问场景的操作更加高效,读写锁的目标就是可以同时多个线程并发执行读操作,写操作等待,当写操作获得执行时,所有其他线程的读操作和写操作都将等待。总结就是:读读不互斥,读写互斥,写写互斥,写读互斥。例子import java.util.HashMap;import java.util.Map;import java.ut原创 2016-03-31 17:27:39 · 441 阅读 · 0 评论 -
Java内存模型总结
Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。1、多线程通信1.1 内存模型Java线程之间的通信由转载 2016-03-31 12:06:48 · 427 阅读 · 0 评论 -
java同步代码块和同步方法的区别
原创 2016-03-17 11:01:51 · 1463 阅读 · 0 评论 -
Java多线程技术之CyclicBarrier
1、类说明:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。2、使用场景:需要所有的子任务都完成时,才执行主任务,这个时候就转载 2016-04-05 15:27:59 · 393 阅读 · 0 评论 -
java多线程之线程的6种状态
A thread state. A thread can be in one of the following states: NEW A thread that has not yet started is in this state. RUNNABLE A thread executing in the Java virtual machine is in this state....原创 2016-04-05 15:58:03 · 787 阅读 · 0 评论 -
java多线程之FutureTask
简介我们在处理多线程任务时希望在任务被取消或者正常完成后做一些后期处理,例如释放系统资源,更新数据库状态等等。java多线程技术中为我们提供了这样一个类叫FutureTask,他可以帮助我们实现任务在done状态后可以做一些后期处理。例子import java.util.concurrent.Callable;import java.util.concurrent.TimeU原创 2016-04-11 10:13:06 · 1502 阅读 · 0 评论 -
Java Executors(线程池)
Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。 有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程。转载 2016-03-29 10:57:43 · 396 阅读 · 0 评论 -
Java四种线程池的使用
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。转载 2016-03-29 10:54:15 · 341 阅读 · 0 评论 -
张老师:5.6.线程范围内共享技术
简介如上图,Connection必须是线程访问内共享,否则事务提交将出现错乱。线程内共享的意思就是每个线程拥有独立的一份数据,相互不干扰,如上图每个线程拥有独立的Connection。总结起来就是:线程内共享,线程外独立。示例1public class A { private ThreadLocal tlInteger = null; public原创 2016-03-29 09:11:31 · 363 阅读 · 0 评论 -
张老师:4.传统线程同步通讯技术
问题子线程循环10次,主线程循环100次,又子线程循环10次,主线程循环100次,如此循环50次,写出代码实现。 代码实现/** * 将线程需要同步的资源包装在一个类里面, * 不要由外层代码去控制资源同步,这样做的好处是易维护和高内聚。 * @author liujun */public class Busnice { /**是否是到子线程执行了*/ priva...原创 2016-03-28 10:51:18 · 469 阅读 · 0 评论 -
java多线程之Exchanger
简介java提供了一个同步工具类Exchanger,它允许在两个并发任务中交换数据。Exchanger允许在两个线程之间定义同步点,当两个线程到达同步点时可以交换数据,第一个线程的数据进入到第二个线程,第二个线程的数据进入第一个线程。先到达同步点的线程会等待另外一个线程,到达后完成数据交换。下面将举例只有一个生产者和一个消费者,这两个线程交换集合,那么生产者生产的数据交换到消费者,消费者交换空原创 2016-04-07 17:11:54 · 826 阅读 · 0 评论 -
java多线程之Phaser
简介java多线程技术提供了Phaser工具类,Phaser表示“阶段器”,用来解决控制多个线程分阶段共同完成任务的情景问题。其作用相比CountDownLatch和CyclicBarrier更加灵活,例如有这样的一个题目:5个学生一起参加考试,一共有三道题,要求所有学生到齐才能开始考试,全部同学都做完第一题,学生才能继续做第二题,全部学生做完了第二题,才能做第三题,所有学生都做完的第三题,考原创 2016-04-07 09:55:17 · 13304 阅读 · 2 评论 -
java多线程之守护线程(Daemon)
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应转载 2016-04-05 16:40:16 · 15141 阅读 · 4 评论