
并发编程 -- 并发类
文章平均质量分 92
yinni11
这个作者很懒,什么都没留下…
展开
-
多线程环境中的变量的定义
1. ThreadLocal的初始化定义protected static final ThreadLocal<Set<String>> VERTEX_TABLES_THREAD_LOCAL = ThreadLocal.withInitial(HashSet::new);转载 2019-07-05 10:26:31 · 959 阅读 · 0 评论 -
Java并发编程75道面试题及答案——稳了
1、在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。两者的区别: 唯一...转载 2018-08-17 17:07:17 · 301 阅读 · 0 评论 -
fork/join模式中fork和invokeAll的区别
有一类问题,他们的本质上是将一个问题划分成多个子问题,然后再逐个的去解决子问题。在很多情况下,他们这些子问题是互不相干的。也就是说,我们针对他们每个执行的子问题,可以让他们采用独立的线程来运行。这样的话我们可以充分的发挥现在并行处理器的优势。 在fork/join模式中,我们在子任务中常常使用fork方法来让子任务采取异步方法执行,但是这不是高效的实现方法,尤其是对于forkjoin...转载 2018-08-17 15:39:24 · 978 阅读 · 0 评论 -
Java并发编程五:Fork/Join框架介绍
1、Fork/Join框架是什么Fork/Join框架是一个比较特殊的线程池框架,专用于需要将一个任务不断分解成多个子任务(分支),并将多个子任务的结果不断进行汇总得到最终结果(聚合)的并行计算框架。 Fork/Join框架示例图(图片来自互联网)2、相关类说明ForkJoinTask:我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行f...转载 2018-08-17 15:12:51 · 186 阅读 · 0 评论 -
特殊的线程池---Fork/Join框架介绍及实例讲解
什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和Join这两个单词来理解下Fork/Join框架,Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务...转载 2018-08-17 10:28:41 · 186 阅读 · 0 评论 -
并发编程中的三个概念-----并发编程中可能出现的问题
并发编程中的问题在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。我们先看具体看一下这三个概念:1.原子性 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元...转载 2018-08-08 21:03:20 · 3608 阅读 · 2 评论 -
Synchronized和volatile 的区别,两者使用的场景
同步关键字Synchronized使用的场景: Synchronized的修辞范围为: 1. 修饰一个代码块 2.修饰一个方法 3.修饰一个类 4.修饰一个静态的方法public class Thread1 implements Runnable { public void run() { synchronized(this) { ...原创 2018-08-08 20:08:34 · 4728 阅读 · 0 评论 -
java.util.concurrent包下的Fork/Join框架
Fork/Join是JDK1.7的新特性。这个框架被设计用来解决可以使用分而治之技术将任务分解成更小的问题。1.概念介绍参考链接:http://ifeve.com/fork-join-1/1)fork和join如何理解呢?fork就是创建分支的意思:如果任务大小小于我们能接受的大小,那线程直接执行;否则,我们会创建分支,由两个子线程来执行原任务,依次递归;join就是线程等待的意思:...转载 2018-08-14 22:54:01 · 383 阅读 · 0 评论 -
concurrent(2)—lock和condition
Lock和Condition只是concurrent中的两个接口,但基于这两个接口实现的类完成了先前由synchronized和object共同实现的方法。 但就生产者消费者来说(参考生产者与消费者),Lock相当于synchronized,而Condition的await()和signal()方法相当于Object的wait()和notify()方法。 在讲解Lock和Condition之前...转载 2018-08-14 22:35:33 · 177 阅读 · 0 评论 -
线程池之------使用线程池实现线程的复用和一些坑的避免
前几篇:Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(4)-线程间通信机制的介绍与使用Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信Java多线程编程-(6)-两种...转载 2018-08-01 21:09:24 · 5387 阅读 · 0 评论 -
DelayQueue原理分析
DelayQueue基本简介DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed 元素。DelayQueue是一个用来延时处理的队列,所谓延时处理就是说可以为队列中元素设定一个过期时间,相关的操作受到这个设定时间的控制。DelayQueue使用场景a) 关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间...转载 2018-08-27 20:19:23 · 597 阅读 · 0 评论 -
Java阻塞队列详解
更新日志日期 更新内容 备注 2017-11-03 添加转载标志 持续更新 阻塞队列阻塞队列是一种队列,一种可以在多线程环境下使用,并且支持阻塞等待的队列。也就是说,阻塞队列和一般的队列的区别就在于:多线程环境支持,多个线程可以安全的访问队列 支持生产和消费等待,多个线程之间互相配合,当队列为空的时候,消费线程会阻塞等待队列不为空;当队列满了的时候,生...转载 2018-08-27 23:17:26 · 819 阅读 · 0 评论 -
java线程池01-ThreadPoolExecutor构造方法参数的使用规则
为了更好的使用多线程,JDK提供了线程池供开发人员使用,目的在于减少线程的创建和销毁次数,以此达到线程的重复利用。其中ThreadPoolExecutor是线程池中最核心的一个类,我们先简单看一下这个类的继承关系。其中Executor是线程池的顶级接口,接口中只定义了一个方法void execute(Runnable command);线程池的操作方法都是定义在ExecutorSe...转载 2019-05-08 17:19:14 · 729 阅读 · 0 评论 -
使用AsyncRestTemplate对象进行异步请求调用
最近在公司写了个项目,需要优化下业务逻辑层。由于第三方需要短时间大量调用第三方API,那么之前的同步调用就会特别慢,而且这种等待是不方便用户的、对用户不友好的。你设想下同时附近1000个司机、1000个乘客同时发布行程。同步调用的方法,必须等待一个request请求高德得到返回值后才会执行下一个request,响应时间就会特别慢。 AsyncRestTemplate是在Spring4.0中对R...转载 2018-12-11 17:58:43 · 615 阅读 · 0 评论 -
ExecutorService中submit的理解
package com.haizhi.gap.search.offline.service.impl;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java....原创 2018-11-16 18:24:19 · 4733 阅读 · 0 评论 -
ExecutorService中submit和execute的区别
在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。在Java5以后,通过Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特性。一、创建任务任务就是一个实现了Runnable接口的类。创建的时候实run方法即可。二、执行任务通过jav...原创 2018-11-16 09:37:57 · 247 阅读 · 0 评论 -
并发编程----接口聚合 (实现方法)
并发编程1.在Service中实现多线程的返回结果聚合,例如下图分三个线程,线程1、线程2、线程3来现实用户信息系统、用户余额系统、用户积分系统最后进行返回结果聚合 2。在使用多线程的情况下,继续使用线程池来实现减少运行时间。3。怎么增加吞吐量 在Tomcat中,server.xml中有MaxThread =150,即最多有150个主线程并发执行。 见下图增加吞...原创 2018-09-25 21:59:37 · 5138 阅读 · 0 评论 -
Java中Semaphore(信号量)的使用
Semaphore的作用:在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解决多个线程并发同一资源造成的数据不一致的问题。在另外一种场景下,一个资源有多个副本可供同时使用,比如打印机房有多个打印机、厕所有多个坑可供同时使用,这种情况下,Java提供了另外的并发访问控制--...转载 2018-09-10 14:29:11 · 144 阅读 · 0 评论 -
对于高并发,没有战场,只能模拟的一些思考
用压力测试工具,比如Jmeter,模拟并发访问。亚自己写的项目,最好压自己的测试服务器。并发由低到高,阶梯增长。分析log,发现问题,解决问题。这时候,事情变得就开始简单一点。SQL问题,优化SQL逻辑复杂,简化逻辑数据库忙,NoSQL缓项目臃肿,功能拆分前端缓慢,上CDN单功能堵,加上队列用户多了,部署集群 静态资源用CDN,秒杀地址redis,redis...转载 2018-09-06 14:22:16 · 140 阅读 · 0 评论 -
java 为什么wait(),notify(),notifyAll()必须在同步(Synchronized)方法/代码块中调用?
先回答问题:(1)为什么wait()必须在同步(Synchronized)方法/代码块中调用?答:调用wait()就是释放锁,释放锁的前提是必须要先获得锁,先获得锁才能释放锁。(2)为什么notify(),notifyAll()必须在同步(Synchronized)方法/代码块中调用?答:notify(),notifyAll()是将锁交给含有wait()方法的线程,让其继续执行下去...转载 2018-09-03 16:16:57 · 1597 阅读 · 0 评论 -
java线程池—ThreadPoolExecutor
摘自阿里巴巴开发手册: 【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors 返回的线程池对象的弊端如下: 1)FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VA...转载 2018-05-07 22:26:36 · 278 阅读 · 0 评论 -
深入解析Java AtomicInteger原子类型
深入解析Java AtomicInteger原子类型在进行并发编程的时候我们需要确保程序在被多个线程并发访问时可以得到正确的结果,也就是实现线程安全。线程安全的定义如下:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的。举个线程不安全的例子。假如我们想实...转载 2018-08-01 08:07:02 · 160 阅读 · 0 评论 -
Java并发编程的总结与思考
编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是对并发编程的一点总结和思考,同时也分享了Java 5以后的版本中如何编写并发代码的一点点经验。为什么需要并发 并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(...转载 2018-04-23 16:26:22 · 171 阅读 · 0 评论 -
并发类之--BlockingQueue详解
本例介绍一个特殊的队列:BlockingQueue,如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒,同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间时才会被唤醒继续操作。 本例再次实现前面介绍的篮子程序...转载 2018-04-12 17:57:16 · 192 阅读 · 0 评论 -
JAVA线程池--Executors之什么是线程池,为什么使用线程池以及线程池的使用
1. 为什么需要线程池? 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。 线...转载 2018-04-12 17:54:12 · 2804 阅读 · 0 评论 -
并发类之ConcurrentHashMap 和 BlockingQueue 的使用场景
第一部分: ConcurrentHashMap的使用场景是:多个线程的共享资源,虽然在操作中有可能增加和删除数据,但是主要目的是共享 BlockingQueue的使用场景是:生产者和消费者场景。当产生的数据过多的时候,对方(消费者)来不及处理,就将数据放到BlockingQueue中,以免数据的丢失,等待消费者的处理。 例如: BlockingQueue<St...原创 2018-04-12 17:38:41 · 785 阅读 · 0 评论 -
[Java并发包学习八]深度剖析ConcurrentHashMap
点击打开链接目录(?)[-]概述 ConcurrentHashMap的目的 实现原理 初始化 put操作 get操作 size操作 containsValue操作 关于hash 注意事项 声明概述还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多面试书中都说到:HashMap是非线程安全的,HashTable是线程安全的...转载 2018-04-02 15:55:14 · 128 阅读 · 0 评论 -
Concurrency包之并发队列---BlockingQueue
1.在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。2.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。3.使用背景:(重要) 多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者...转载 2018-04-09 19:41:03 · 188 阅读 · 0 评论 -
java多线程和并发包入门示例---包含多线程的三种实现方式
一、java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题。 java多线程,传统创建线程的方式有两种。 1、继承自Thread类,覆写run方法。2、实现Runnable接口,实现run方法。启动线程的方法都是调用start方法,真正执行调用的是run方法。参考代码如下: 复制代码代码如下:package com.jack.th...转载 2018-04-11 16:28:23 · 481 阅读 · 0 评论 -
谈谈Java中的volatile
谈谈Java中的volatile内存可见性留意复合类操作解决num++操作的原子性问题禁止指令重排序总结内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰...转载 2018-04-20 10:53:28 · 119 阅读 · 0 评论 -
Java并发编程:并发容器之CopyOnWriteArrayList(转载)
原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并...转载 2018-04-20 20:41:54 · 114 阅读 · 0 评论 -
建唯一索引保证并发时,多线程插入数据的业务上的一致性
在项目中遇到并发导入excel数据到同一张表, 最初没有设置unique索引,导致在多线程并发导入excel数据的时候,业务上要求供应商代码不重复的字段,出现了重复,在这张数据表维护的时候,只有逻辑删除,不会物理删除,因此最开始没有去创建供应商代码的unique索引.单纯的对供应商代码做unique索引也是不能满足要求的因为失效删除的数据是打了标记的,有效的相同供应商代码还是可以插入进来...转载 2018-07-23 20:30:51 · 1970 阅读 · 0 评论 -
Java Concurrency代码实例之六-ConcurrentHashMap
因为这个系列将Concurrent包讲的很仔细,先收藏,以备后续的查看本文的读者应该是已经掌握了基本的Java多线程开发技巧,但不熟悉Java Concurrency包的程序员。本文是本系列的第六篇文章,前五篇文章请看这里: Java Concurrency代码实例之一执行者与线程池 Java Concurrency代码实例之二并发队列 Java Concurrency代码实例之三原子变量 Jav...转载 2018-07-16 15:29:56 · 344 阅读 · 0 评论 -
事务并发的可能问题与其解决方案 -----数据库的隔离级别和 悲观锁、乐观锁
一、多个事务并发时可能遇到的问题Lost Update 更新丢失 a. 第一类更新丢失,回滚覆盖:撤消一个事务时,在该事务内的写操作要回滚,把其它已提交的事务写入的数据覆盖了。 b. 第二类更新丢失,提交覆盖:提交一个事务时,写操作依赖于事务内读到的数据,读发生在其他事务提交前,写发生在其他事务提交后,把其他已提交的事务写入的数据覆盖了。这是不可重复读的特例。 Dirty Read 脏读...转载 2018-05-23 23:19:38 · 252 阅读 · 0 评论 -
说说Runnable与Callable
Callable接口:public interface Callable<V> { V call() throws Exception;} Runnable接口:public interface Runnable { public abstract void run();} 相同点:两者都是接口;(废话)两者都可用来编写多线程程序;两者都需要调用Thread.sta...转载 2018-05-07 21:34:34 · 161 阅读 · 0 评论 -
Java分布式应用学习笔记05多线程下的并发同步器----后篇
5. CountDownLatch很多资料上都说CountDownLatch是倒数计数器,我觉得这种说法太过专业,其实它就是一个数数的人员。利用它,可以在多线程执行任务完毕后完成进行多线程的等待,便于等待所有的线程之后在干别的事情,这个有点类似于FutureTask,使用上不太一样。这个场景就是一个线程必须要等到其他线程执行完毕后才能往下执行,注意,这里这个线程没必要需要其他线程的执行结果,而是...转载 2018-04-27 22:50:10 · 241 阅读 · 0 评论 -
Java分布式应用学习笔记05多线程下的并发同步器----前篇
1. 前言JDK提供的并发包,除了上一篇提到的用于集合外,还有线程的调度、协作等等功能。上篇提到过,线程之间除了竞争关系,还有协作关系。在高并发环境下有效利用Java并发包解决线程之间协作的特殊场景。在并行计算,尤其是多线程计算的结果集合并的时候都需要用到这些并发同步器。还有一种使用场景,就是跨越多台机器(实机)的多线程进行并行运算,需要将多台机器进行结果集的汇总,合并。其原理核心也是使用这些并...转载 2018-04-27 22:37:32 · 175 阅读 · 0 评论 -
如何实现超高写多读少并发的无锁缓存
一、需求缘起【业务场景】有一类写多读少的业务场景:大部分请求是对数据进行修改,少部分请求对数据进行读取。例子1:滴滴打车,某个司机地理位置信息的变化(可能每几秒钟有一个修改),以及司机地理位置的读取(用户打车的时候查看某个司机的地理位置)。void SetDriverInfo(long driver_id, DriverInfoi); // 大量请求调用修改司机信息,可能主要是GPS位置的修改Dr...转载 2018-04-21 18:56:08 · 822 阅读 · 0 评论 -
Java并发编程:并发容器之CopyOnWriteArrayList (2)
证明CopyOnWriteArrayList是线程安全的先写一段代码证明CopyOnWriteArrayList确实是线程安全的。ReadThread.javaimport java.util.List;public class ReadThread implements Runnable { private List<Integer> list; ...转载 2018-04-20 21:02:03 · 191 阅读 · 0 评论 -
java并发编程系列之ReadWriteLock读写锁的使用
前面我们讲解了Lock的使用,下面我们来讲解一下ReadWriteLock锁的使用,顾明思义,读写锁在读的时候,上读锁,在写的时候,上写锁,这样就很巧妙的解决synchronized的一个性能问题:读与读之间互斥。ReadWriteLock也是一个接口,原型如下: [java] view plain copypublic interface ReadWriteLock { ...转载 2018-04-20 20:16:54 · 176 阅读 · 0 评论