
Java并发编程
文章平均质量分 90
刘彦青-Yannis
这个作者很懒,什么都没留下…
展开
-
使用 ThreadPoolExecutor 管理线程池
ThreadPoolExecutor 是 Java 多线程编程中非常重要的工具,能够高效地管理线程的生命周期,提高程序性能和资源利用率。合理配置线程池参数,选择适当的拒绝策略,是保证系统稳定性和性能的关键。原创 2023-10-10 15:46:16 · 194 阅读 · 0 评论 -
java实现分布式锁
那什么是分布式锁呢,它又是用来解决哪些问题的呢?在 JVM 中,在多线程并发的情况下,我们可以使用同步锁或 Lock 锁,保证在同一时间内,只能有一个线程修改共享变量或执行代码块。但现在我们的服务基本都是基于分布式集群来实现部署的,对于一些共享资源,例如我们之前讨论过的库存,在分布式环境下使用 Java 锁的方式就失去作用了。这时,我们就需要实现分布式锁来保证共享资源的原子性。除此之外,分布式...转载 2020-02-19 22:16:19 · 1908 阅读 · 0 评论 -
如何实现幂等性
什么是幂等幂等本来是数学上的概念,它的定义是这样的: 如果一个函数 f(x) 满足:f(f(x)) = f(x),则函数 f(x) 满足幂等性。在计算机领域用来描述一个操作、方法或者服务。一个幂等操作的特点是,其任意多次执行所产生的影响均与一次执行的影响相同。场景将林志玲账户的余额加 100 元方法一:利用数据库的唯一约束实现幂等我们在数据库中建一张转账流水表,这个表有三个字段:...原创 2019-11-14 17:09:47 · 4971 阅读 · 0 评论 -
基于消息队列实现分布式事务
给予消息队列实现分布式事务场景:订单系统产生订单,购物车系统减购物车中的商。实现思路 :1. 订单系统在消息队列上开启一个事务(没有创建订单)。2. 订单系统给消息服务器发送一个“半消息”,这个半消息不是说消息内容不完整,它包含的内容就是完整的消息内容,半消息和普通消息的唯一区别是,在事务提交之前,对于消费者来说,这个消息是不可见的。3. 半消息发送成功后,订单系统就可以执行本地事...原创 2019-11-13 18:21:10 · 1897 阅读 · 0 评论 -
java中的线程&创建线程的三种方式
java语言里的线程本质上就是操作系统的线程,他们是一 一对应的线程生命周期线程状态转换图—— 五态模型初始状态: 线程已经被创建,但是还没有分配CPU执行。 这个状态属于编程语言特有的,不过这里所谓的被创建,仅仅时在编程语言层面被创建,而在操作系统层面,真正的线程还没创建。可运行状态:初始状态线程执行start()方法,线程具备CPU的执行资格,没有CPU的执行权。 这种状...原创 2019-09-23 18:23:33 · 1102 阅读 · 0 评论 -
Lock和Condition(可重入锁)
Lock有别于synchronized隐式锁的三个特征:能够响应中断。支持超时和非阻塞地获取锁,也就是说lock比synchronized的功能丰富。JavaSDK并发包通过Lock和Condition两个接 口来实现管程,其中Lock用于解决互斥问题,Condition用于解决同步问题 。Lock接口的三个方法:// ⽀持中断的API void lockInterrupti...原创 2019-09-23 18:18:15 · 1448 阅读 · 0 评论 -
锁和synchronized
锁的常见概念互斥: 同一时刻只有一个线程执行临界区:一段需要互斥执行的代码细粒度锁: 用不同的锁对受保护资源进行精细化管理。 细粒度锁可以提高并行度,是性能优化的一个重要手段死锁 :一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象 。synchronizedclass X{ //修饰非静态方法 synchronized void foo(){ ...原创 2019-09-12 18:27:29 · 206 阅读 · 0 评论 -
并发编程三要素:原子性,有序性,可见性
并发编程三要素原子性:一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。有序性: 程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)可见性: 一个县城对共享变量的修改,另一个线程能够立刻看到。一、原子性线程切换会带来原子性的问题int i = 1; // 原子操作i ; // 非原子操作,从主内存读取 i 到线程工作内...原创 2019-09-12 16:06:29 · 5620 阅读 · 3 评论 -
ReadWriteLock读写锁
读写锁,分场景优化,提升性能。读写锁遵守的基本原则:允许多个线程同时读共享变量。只允许一个线程写共享变量。如果一个写线程正在执行写操作,此时禁止多线程读共享变量。读锁与写锁是互斥的;写锁与写锁也是互斥的。读写锁适用于读多写少的场景。读写锁与互斥锁的区别:读写锁运行多个线程同时读共享变量。ReadWriteLock 是一个接口,ReentrantReadWriteLock可...原创 2019-09-23 18:26:46 · 399 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor
创建对象仅仅在JVM的堆里为线程分配一块内存,而创建一个线程需要调用操作系统内核的API,然后操作系统要为线程分配一系列的资源。所以线程是一个重量级的对象,应该避免频繁的创建和销毁。线程池是一种生产者-消费者模式ThreadPoolExecutorThreadPoolExecutor的构造函数比较复杂,最完备的构造有7个参数。ThreadPoolExecutor( ...原创 2019-09-24 09:54:18 · 975 阅读 · 0 评论 -
Java volatile关键字-禁用CPU缓存
可见性: 一个县城对共享变量的修改,另一个线程能够立刻看到。volatile的意义时禁用CPU缓存public class VolatileExample { int x = 0; volatile boolean v = false; public void writer(){ x = 42; v = true; } ...原创 2019-09-25 11:42:06 · 1377 阅读 · 0 评论 -
ForkJoin实现分而治之
对于简单的并行任务可以通过"线程池 Future"方案来解决。如果任务额之间有聚合关系(AND聚合或者OR聚合)用CompletableFuture解决。批量的并行任务用CompletionService解决。并发编程可以分为三个层面的问题: 分工,协作,互斥。ForkJoin有什么用Fork/Join是一个并行计算的框架,主要就是用来支持分治任务模型的,这个计算框架里的Fork...原创 2019-09-25 11:04:47 · 1049 阅读 · 0 评论 -
CompletionService批量执行异步任务
CompletionService的实现原理也是内部维护了一个阻塞队列,当任务执行结束就把任务的执行结果加入到 阻塞队列中,不同的是CompletionService是把任务执行结果的Future对象加入到阻塞队列中CompletionService能做什么?将异步任务的结果保存到队列中,主线程从队列中取出这些结果数据执行。场景: 向不同电商平台询价,并保存价格采用“ThreadPool...原创 2019-09-25 10:45:10 · 1430 阅读 · 0 评论 -
CompletableFuture异步编程
CompletableFuture 有什么用CompletableFuture是用来描述多线程任务的时序关系的:串行关系,并行关系,聚合关系。CompletableFuture 是Java 8 新增加的Api,该类实现,Future和CompletionStage两个接口,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处...原创 2019-09-24 18:38:07 · 1185 阅读 · 0 评论 -
Smaphor(信号量)实现限流器
Semaphore信号量在管程被提出来之前用的是信号量。信号量模型一个计数器,一个等待队列,三个方法。计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问他们,这三个方法分别是:init()、down()、up()init():设置计数器的初始值down(): 计数器的值减1; 如果此时计数器的值小于0,则当前线程被阻塞,否则当前线程继续执行up(): 计数...原创 2019-09-24 18:01:12 · 697 阅读 · 0 评论 -
StampedLock悲观锁乐观锁
StampedLock java1.8提供的, 性能比ReadWriteLock好.语法 final StampedLock sl = new StampedLock(); /** * 悲观读锁 * 与ReadWriteLock的读锁相似 * 允许多个线程进行读操作 * 与写锁互斥 **/ //获取悲观锁 ...原创 2019-09-24 17:52:52 · 769 阅读 · 0 评论 -
计数器:CountDownLatch,循环栅栏:CyclicBarrier
// 创建2个线程的线程池 Executor executor = Executors.newFixedThreadPool(2);while(存在未对账订单){ // 计数器初始化为2 CountDownLatch latch = new CountDownLatch(2); // 查询未对账订...原创 2019-09-24 17:30:22 · 1222 阅读 · 0 评论 -
安全性、活跃性已经性能问题
安全性并发编程是一个复杂的技术领域,微观上涉及到原子性问题、可见性问题和有序性问题,宏观则表现为安全性、活跃性以及性能问题。线程安全: 程序按照我们期望的执行如何才能写出线程安全的程序:避免出现原子性问题,可见性问题和有序性问题数据竞争: 当多个线程同时访问同一数据,并且至少有一个线程会写这个数据的时候,竞态条件:程序的执行结果依赖程序执行的顺序活跃性活锁: 线程之间相互谦让...原创 2019-09-25 12:21:09 · 1040 阅读 · 0 评论