![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java 并发编程
java并发编程记录
叹人间,美中不足今方信
这个作者很懒,什么都没留下…
展开
-
Java延时队列任务Delayed实现的失败重试任务(可以直接使用)
RetryBean重试配置import java.io.Serializable;import java.util.Date;/** * 重试实体 **/public class RetryBean implements Serializable { public RetryBean() { this.createTime = new Date(); } /** * 创建时间 */ private Date createT原创 2021-01-25 21:16:40 · 1446 阅读 · 2 评论 -
ThreadLocal的理解与正确使用
本地变量副本别人总是说用使用ThreadLocal可以避免线程不安全的问题,因为ThreadLocal使用的本地变量副本。怎么理解本地变量副本这个概念呢?线程的创建和销毁是非常消耗资源的,所以有了线程池,重复利用线程一个线程,每执行一个任务,任务中都去创建对象,例如SimpleDateFormat对象,同样很消耗资源使用ThreadLocal给当前线程绑定一个SimpleDateFormat对象,让这个线程每次执行任务,通过ThreadLocal#get方法获取SimpleDateFormat对象原创 2021-01-10 22:30:33 · 230 阅读 · 1 评论 -
Java实现自旋锁、独占锁和共享锁
简述AQS全称AbstractQueueSynchronizer,在java.util.concurrent.locks包下,是构建锁和其他同步器的框架,它的定位是能够成为实现大部分同步需求的基础。Java中基于AQS的有ReentrantLock、Semaphore、读写锁、CountDownLatch等。同步器内部维护一个volatile的int类型的成员变量表示同步状态,主要使用方式是通过子类继承同步器,实现它的抽象方法(try开头的方法)来管理同步状态。在同步器的内部提供了一个FIFO双向队列完原创 2020-12-18 23:13:20 · 290 阅读 · 1 评论 -
Java多线程run方法中一定要用try...catch
多线程编程中,run方法中的代码一定要用try...catch包裹,否则会出现如下问题run方法中使用while循环,没有try和try在while外面是等价的,当run方法中出现异常,会导致while循环结束// 错误示例:@Overridepublic void run() { while (true) { System.out.println("run");...原创 2019-07-16 18:51:37 · 2424 阅读 · 0 评论 -
Java基于CountDownLatch的持续并发测试工具
优化之前的一篇博客点这里,持续测试并发。public abstract class AbstractConcurrentControl { public AtomicLong longCounter = new AtomicLong(0); public static final int DEFAULT_CONCURRENT_CONTROL = 160; publi...原创 2019-05-17 17:36:29 · 614 阅读 · 0 评论 -
JVM锁优化
自旋锁和自适应自旋自旋锁是当多个线程并行访问共享数据时,用忙循环让后面请求锁的线程处于等待状态,当自旋多次后仍然获取不到锁,再用传统的方式将线程挂起。忙循环就是用循环让线程等待,忙循环也叫自旋。在Java6之后,如果有线程刚通过自旋获得了锁,并且线程正在运行,那么JVM会认为自旋获取锁的命中率高,其他线程的自旋次数可能会增多。如果某个锁通过自旋获得的次数少,JVM可能会省略掉自旋获取锁,直接...原创 2020-03-13 15:54:10 · 208 阅读 · 0 评论 -
Java基于CountDownLatch的并发测试工具
抽象并发控制类AbstractConcurrentControl :使用步骤:1.单元测试类继承此类;2.重写blockingCode方法,定义自己的并发代码;3.重写encapsulatingData方法,定义数据的拼装,并在blockingCode方法中调用;4.重写blockingMainThread方法,定义主线程阻塞策略import java.util.concurrent....原创 2019-04-12 11:39:43 · 2142 阅读 · 0 评论 -
线程池中如何使用Spring事务
下面的代码在线程池中调用deviceInfoService服务的updateDeviceInfo方法,接着抛出空指针异常,然而数据没有回滚。public void testUpdate() { executor.execute(new Runnable() { @Override public void run() { DeviceInfo deviceInfo = new De...原创 2019-03-15 17:57:53 · 7677 阅读 · 2 评论 -
ThreadPoolTaskExecutor遇到的坑
在利用org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor实现请求的慢处理时,我的配置中核心线程数为5,最大线程数为10,但是代码中创建了8个队列放在线程池中,假如我用id去hash取模,得到队列集合下标,从队列集合中队列,此时就会出现8个队列中,每个队列都有数据,但只有前5个队列中的请求被处理,后3个队列的请求被搁置。...原创 2018-11-12 10:23:46 · 25272 阅读 · 3 评论 -
Java线程中处理运行时异常(UncaughtExceptionHandler)
线程在执行单元中不允许抛出checked异常,而且线程运行在自己的上下文中,派生它的线程无法直接获得它运行中出现的异常信息。对此,Java为我们提供了UncaughtExceptionHandler接口,当线程在运行过程中出现异常时,会回调UncaughtExceptionHandler接口,从而得知是哪个线程在运行时出错。UncaughtExceptionHandler接口在Thread中定义。...原创 2018-10-10 22:18:20 · 3729 阅读 · 0 评论 -
JVM可以创建多少线程?
在JVM中,线程数量的多少与堆内存、栈内存的大小有着直接的关系,只不过栈内存更加明显一些。在操作系统中,一个进程的内存大小是有限制的,这个限制称为地址空间,比如32位的Windows操作系统最大的地址空间约为2G多一点,操作系统会将进程内存的大小控制在最大地址空间以内。下面是一个相对比较精准的计算线程数量的公式,其中ReservedOsMemory是系统保留内存,一般在136MB左右:线程数量 ...原创 2018-10-22 11:31:14 · 4361 阅读 · 0 评论 -
synchronized 的实现原理与应用
synchronized 是多线程并发编程中的一员,被称为重量级锁,但在 Java SE 1.6 对 synchronized 进行了各种优化,引入偏向锁和轻量级锁,减少了获取锁和释放锁带来的性能消耗。synchronized 实现同步的基础 Java 中的每一个对象都可以作为锁。具体表现为以...原创 2018-03-22 11:47:34 · 1285 阅读 · 0 评论 -
Java 原子操作的实现
Java 原子操作分为处理器实现和 Java 程序实现。处理器实现: 处理器使用基于对缓存加锁或总线加锁的方式实现多处理器之间的原子操作。 (1)第一个机制是使用总线锁保证原子性。 原创 2018-03-22 13:22:50 · 1422 阅读 · 0 评论 -
Java基于DelayQueue实现周期任务实例
自定义周期执行任务首先看一下执行结果:--- 开始执行任务 ---任务1:执行第1次,执行时间:13:29:49:945任务1:下次执行时间:13:30:06:769任务10:执行第1次,执行时间:13:29:49:945任务10:下次执行时间:13:29:52:595任务2:执行第1次,执行时间:13:29:49:945任务2:下次执行时间:13:30:04:773...原创 2018-04-13 14:40:48 · 1478 阅读 · 0 评论 -
Lock锁的使用模板及API解释
实现同步,我们可以使用 synchronized ,也可以使用 Java SE 5 之后新增的 Lock 接口。synchronized 和 Lock 的区别1)synchronized 是 Java 中的关键字;Lock 是个接口 2)synchronized 在发生异常时,会自动释放锁;Lock 必须手动释放锁,应该使用 try…finally ,避免死锁 3)Lock...原创 2018-03-28 20:41:03 · 1786 阅读 · 0 评论 -
Java中的并发工具类
等待多线程完成的 CountDownLatch    CountDownLatch 允许一个或多个线程等待其他线程完成操作。     需求:我们需要解析一个 Exc原创 2018-04-02 14:24:08 · 1220 阅读 · 0 评论 -
Java线程的6种状态、中断、线程间通信
进程:系统中能独立运行并作为资源分配的基本单位,是一个独立运行的活动实体 线程:线程是进程中的一个实体,是系统调度和分派的基本单位Java 线程的6种状态 Java 线程在运行的生命周期中可能有6种不同的状态,在某个时刻,线程只能处于其中的一个.原创 2018-03-24 13:33:54 · 1309 阅读 · 0 评论