![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java多线程专题
文章平均质量分 72
程序男
java 服务端开发者。
展开
-
记一次CPU有规律飙高的线上问题排查过程
cpu问题排查过程原创 2024-02-06 11:34:36 · 1216 阅读 · 0 评论 -
看麻了呀,线程池日志错乱问题
初步怀疑是对象引用问题,导致 PushDataContext newPushDataContext虽然是新对象,但是其值却不是,由于排查过程中并不太方便打印sql,所以仅仅针对pushTaskList做了一次深拷贝,然后测试,结果也不对,另外也在多个地方打印了newPushDataContext对象的地址,印证了每个线程只会持有自己的对象,另外也排除掉了嵌套调用的情况。每个线程只处理一类数据,上下文是隔离的,但是当前日志的内容却打印了别的类型的数据,明显出现错乱,所以可能是组装数据的上下文不是纯隔离的。原创 2024-02-04 11:29:48 · 759 阅读 · 1 评论 -
java并发编程第五章(1) 创建Fork/Join线程池
说明:执行器框架(Executor FrameWork) 将任务的创建和执行进行了分离,通过这个框架,只需要实现Runnable接口的对象和使用Executor对象, 然后将Runnable对象发送给执行器,执行器再负责运行这些任务所需要的线程,包括线程的创建,线程的管理和线程的结束。 java 7新特性 包括了ExecutorService接口的另一种实现方式,用来解决特殊问原创 2015-07-20 08:26:49 · 1014 阅读 · 0 评论 -
java并发编程实战第六章(1)并发集合介绍
1.java中提供了两类适用于并发应用的集合。 1.阻塞式集合(Blocking Collection):这类集合包括添加移除数据的方法。当集合已经满或者为空的时候,被调用的添加或者移除方法就不能立即 被执行,那么调用这个方法的线程将被阻塞,直到该方法可以被成功执行。 2.非阻塞式集合(Non-Blocking Collection):这类集合也包括添加和移除数据的方法原创 2015-08-30 19:44:39 · 563 阅读 · 0 评论 -
java并发实战第六章(2)非阻塞式线程安全列表与一般List集合多线程情况下的比较
这里我把ConcurrentLinkedDeque与List进行对比测试了一下,发现在多线程情况下一般的集合会出现很大的并发性问题,下面就一起探索一下 1.使用ConcurrentLinkedDeque实现的多线程读写数据 任务:添加大量的数据到一个列表集合中 从同一个列表中移除大量的数据/** * * @author fcs * @date 2015-6原创 2015-08-30 20:04:21 · 2237 阅读 · 0 评论 -
java并发编程第六章(3)使用阻塞式线程安全列表
使用阻塞式线程安全列表 2.使用阻塞式线程安全列表 阻塞式列表与非阻塞式列表的主要区别是:阻塞式列表在插入和删除操作时,如果列表已经满或者已经空了的话,操作不会被立即执行。 而是将调用换这个操作的线程阻塞 直到操作可以执行成功。 本节使用LinkedBlockingDeque类来实现阻塞式列表。 使用方法: ta原创 2015-08-30 20:16:02 · 802 阅读 · 0 评论 -
java并发编程实战第五章(4)在任务中抛出异常
4、在任务中抛出异常 1.非运行时异常:必须在方法上通过throws子句抛出,或者在方法体内通过try,catch方式进行捕捉处理,比如IOException或者 ClassNotFounException异常。 2.运行时异常:z这些异常不需要在方法上通过throws处理,也不需要try,catch处理。 说明:不能再ForkJoin类中的compute()原创 2015-08-16 22:20:40 · 790 阅读 · 0 评论 -
java并发编程实战 第五章(2)合并任务的结果
2、合并任务的结果 Fork/Join框架提供了执行任务并返回结果的能力,这类任务都是通过RecursiveTask实现的,并且该类实现了Future接口, 所以通过Future接口得到返回结果。 RecursiveTask类有个抽象方法compute该方法返回由子类决定的泛型类型,并且该方法是执行任务的主要方法。 可以在该方法执原创 2015-07-24 09:53:29 · 1038 阅读 · 0 评论 -
java并发编程实战第五章(3)异步运行任务
3、异步执行任务 在ForkJoinPool中执行ForkJoinTask时,可以采用同步或者异步方式,当采用同步方式执行时,发送任务给Fork/Join线程池的方法直到 任务执行完成后才会返回结果。而采用异步的方式执行任务时,发送任务给执行器的方法将立即返回结果,但是任务仍能继续执行。 当采用同步的方式,ForkJoinPool类采用工作者窃取算法,采用异步的时候不能使用该算法原创 2015-07-24 10:19:38 · 662 阅读 · 0 评论 -
java并发编程第六章(4)使用基于优先级的阻塞式线程安全列表
3.使用按优先级排序的阻塞式线程安全列表 PriorityBlockingQueue实现一个有序列表 说明:所有添加进入PriorityBlockingQueue的元素必须实现Comparable接口。 这个接口提供了compareTo()方法,传入的参数是一个同类型的对象。 当插入元素时,PriorityblockingQueue使用comp原创 2015-08-31 19:04:21 · 539 阅读 · 0 评论 -
java并发编程实战第六章(5)使用带有延迟元素的线程安全列表
4.使用带有延迟元素的线程安全列表 本范例使用DelayQueue类;这个类可以存放带有激活日期的元素。当调用方法从队列中返回或者提取元素时,未来的日期将被忽略。这些元素对于这些方法是不可见的。 为了具有调用行为,存放到DelayQueue类中的元素必须继承Delayed接口。Delayed接口使对象成为延迟对象,它使存放在DelayQueue类中的对象具原创 2015-08-31 19:11:25 · 609 阅读 · 0 评论 -
java并发编程第六章(7)生成并发编程随机数
6.生成并发随机数 java并发API提供了一个特殊类用以在并发程序中生成伪随机数。在java 7中新引入的ThreadLocalRandom类。是线程本地变量。 每个生成随机数的线程都有一个不同的生成器, 但是都在同一个类中被管理,对程序员来说是透明的。相比于使用共享的Random对象为所有线程生成随机数,这种机制具有更好的性能。 该方法是一个静态方法原创 2015-09-02 19:29:46 · 1312 阅读 · 0 评论 -
java并发编程第六章(6)使用线程安全可遍历映射
5.使用线程安全可遍历映射 本范例用到的接口和实现类:ConcurrentNavigableMap接口及其实现类。实现这个接口的类以如下两部分存放元素 1.一个键值(key),它是元素的标示并且是唯一的。 2.元素其他部分数据。 ConcurrentSkipListMap类实现了ConcurrentNavigaleMap接口。从内部实现机制来讲,它使原创 2015-09-02 19:24:58 · 790 阅读 · 0 评论 -
java并发编程第六章(9)使用原子数组
8.使用原子数组 针对容易引发问题的同步机制(比如Synchronized关键字)等java引入了比较和交换操作(CAS)。这个操作使用 以下三步修改变量的值。 1.取得变量值,即变量的旧值 2.在一个临时变量中修改变量值,即变量的新值。 3.如果上面获得的变量旧值与当前变量值相等,就用新值替换旧值。如果已有其他线程修改了这个变量的值,原创 2015-09-05 09:05:56 · 1165 阅读 · 0 评论 -
java并发编程实战第六章(8)使用原子变量
7.使用原子变量 说明:原子变量(Atomic Variable): 提供了单个变量上的原子操作。在编译程序时, java代码中的每个变量,每个操作都将被转换成机器可以理解的指令。 例如,当给一个变量赋值时,在java代码中只使用一个指令, 但是编译这个程序时,指令被转换成JVM语言的不同指令。 当多个线程共享同一个变量时,就会发生数据不一原创 2015-09-05 08:26:36 · 802 阅读 · 0 评论 -
cmd下运行java程序的注意事项
在cmd下运行java类程序是一个java程序员的基本功,但是弄了挺长时间都没怎么弄好,这次算是一个插曲吧,有点丢人了。以前也弄过几次,但是都没怎么弄好,这次终于好使了。下面是我的环境变量设置: 其实一般只要在系统变量下设置java的环境变量就行,因为运行java程序时会根据系统中的环境变量寻找路径上的运行环境。 然后的一点是我们如果是在项目中运行程序,比如这原创 2015-07-19 20:46:46 · 1299 阅读 · 0 评论 -
java并发编程第四章 总结
java并发编程手册学习知识点原创 2015-07-19 13:44:51 · 886 阅读 · 0 评论 -
java并发编程实战手册第二章使用读写锁实现同步数据访问
Java并发编程实战手册第二章关于锁的问题。2.6使用读写锁实现同步数据访问 通过本范例学习ReadWriteLock和实现类,ReentrantReadWriteLock,该类有两个锁一个是读操作锁,一个是写操作锁。读操作锁可以允许多个线程同时访问,写操作锁只允许一个线程进行。当写操作执行的时候,读操作不能执行 1. 创建PriceInfo,Reader,Writer,Main. 1.原创 2015-04-15 18:38:56 · 628 阅读 · 0 评论 -
java并发编程实战手册第二章笔记
2.2使用synchronized实现 方法,银行存取款的案例,包括线程安全和线程不安全的两种演示代码,包括静态实例方法与静态同步方法的区别,静态同步方法与实例同步方法的使用 2.2.线程安全的操作:package cn.fans.chapter2.one;import java.util.concurrent.TimeUnit;/** * * @author fcs * @date原创 2015-04-16 19:31:11 · 545 阅读 · 0 评论 -
java并发编程实战手册第二章2.8与死锁的演示
java并发编程实战手册笔记。原创 2015-04-16 19:32:40 · 729 阅读 · 0 评论 -
java并发编程实战手册第三章---CountDownLatch使用
一、等待多个并发事件的完成 本案例使用CountDownLatch实现,也叫倒计数锁存器(话说,这样不知道对不对), 本范例实现视频会议系统,这个视频会议系统将等待所有的参与者都到齐才开始。 看源码: 1.视频会议类Videoconference/** * * @author fcs * @date 2015-4-19 * 描述: 等待多个并发事件的完成 * 说明:可以使用co原创 2015-05-03 17:48:48 · 592 阅读 · 0 评论 -
java并发编程实战手册第三章同步辅助类--Semaphore
一、使用信号量进行资源的并发访问控制 本实例使用一种二进制信号量。是一种比较特殊的信号量,用来保护对唯一共享资源的访问,因而内部计数器只有0 和1两个值。 本实例创建10个线程竞争一个打印机使用一个打印队列实现。 看代码 1、打印队列类/** * * @author fcs * @date 2015-4-19 * 描述:资源的并发访问控制 * 说明:信号量原创 2015-05-03 16:20:15 · 688 阅读 · 0 评论 -
java并发实战手册第三章(线程同步辅助类介绍)
java并发实战手册第三章---线程同步辅助类简介在第二章中我们学习了同步和临界区的概念。并且讨论了多个并发任务共享一个资源时的同步情况。这个共享资源可以是一个对象也可以是一个对象的一个属性。访问共享资源的代码叫做临界区第二章回顾(基本的同步机制)synchronized关键字Lock接口以及其实现类:如ReentrantLock,ReentrantReadWriteLock.ReadLoc原创 2015-05-03 15:49:47 · 625 阅读 · 0 评论 -
java 并发编程实战第三章同步辅助类CyclicBarrier解析
java并发编程实战第三章 同步辅助类CyclicBarrier解析本实例演示了该类的一个主要用途:在集合点的同步。 4.在集合点的同步(这里的任务是分两个阶段完成的,而且这两个阶段是受到CyclicBarrier控制的) 这里的演示范例是指多个线程将在同一个集合点完成工作,并进入下一个工作。与第三个案例相似,但是更加强大。本案例使用了一个分治编程技术。 使用C原创 2015-05-04 19:22:25 · 732 阅读 · 1 评论 -
java并发编程实战手册第三章同步辅助类Phaser
java 1.7新增的特性 本案例简介:5.并发阶段任务的运行(http://blog.csdn.net/escaflone/article/details/10418651) Phaser允许执行并发多阶段的任务。当我们有并发任务并且需要分解成几步执行的时候,这种机制非常好。 Phaser类机制是在每一步结束的位置对线程进行同步,当所有的线程都完成了这一步,才允许执行原创 2015-05-04 19:59:48 · 770 阅读 · 0 评论 -
java并发编程实战手册第三章同步辅助类Exchanger
本实例使用Exchanger来演示一对一的生产者和消费者问题.并发任务间的数据交换(生产者—消费模型(一对一)) 本案例使用Exchanger同步辅助类实现,该类运行在并发任务之间交换数据。该类允许两个线程之间定义同步点,当两个线程都到达同步点的时候,它们交换数据结构,因此第一个线程 的数据结构进入到第二个线程中,同事第二个线程的数据结构进入到第一个线程中。1.Consumer类/**原创 2015-05-04 20:31:07 · 508 阅读 · 0 评论 -
java并发编程第四章 线程执行器(4)
java并发编程实战手册第四章 线程执行器中控制任务的执行原创 2015-06-14 11:39:56 · 589 阅读 · 0 评论 -
java并发编程第四章 线程执行器(2)
java并发编程实战手册第四章第二大部分,线程执行器处理返回任务原创 2015-06-14 11:15:48 · 539 阅读 · 0 评论 -
java并发编程第四章 线程执行器(1)
java并发编程实战手册 线程执行器原创 2015-06-14 10:59:32 · 678 阅读 · 0 评论 -
java并发编程第四章线程执行器(3)
java并发编程实战手册第四章 线程执行器中执行周期性任务和延时任务原创 2015-06-14 11:30:08 · 628 阅读 · 0 评论 -
java并发编程第四章 线程执行器(5)
10.在执行器中分离任务的启动与结果的处理 当我们要在一个对象中发送任务给执行器,在另一个对象中处理结果时,对于这种需求可以使用CompletionService类。 该类有一个方法用来发送任务给执行器,还有一个方法为下一个已经执行结束的任务获取Future对象。从内部实现机制来看,CompletionService类使用Executor对象来执行任务。 这个行为原创 2015-07-19 13:43:58 · 472 阅读 · 0 评论 -
java并发编程实战手册第一章
1.线程的创建和运行 package cn.fans.chapter1.one; /** * * @author fcs * @date 2015-4-11 * 描述:打印乘法表 * 说明: */ public class Calculator implements Runnable {private int number;public Calculator(int原创 2015-04-11 18:12:18 · 697 阅读 · 0 评论