![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
干了这杯柠檬多
运气是实力的一部分,但我运气向来不好,所以只能靠实力去弥补!
展开
-
合理的在线程池中使用CountDownLatch锁
问题:使用线程池来进行多线程操作的话,怎么实现让主线程等待其他线程的任务执行完后再进行接下来的操作。解决方案:线程池+CountDownLatchdemo:public void testLock(){ //模拟并发 List<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); ids.add(3); ids.a原创 2022-04-12 21:35:01 · 1131 阅读 · 0 评论 -
使用CompletableFuture提高并发处理能力
背景:在拼接参数对象时,需要从多个系统里获取参数,比如商品参数要从商品系统获取,价格参数要从价格系统获取,库存参数要从库存系统获取,大部分都是一个rpc调用。方案:为了提高接口性能,采用多线程,使用CompletableFuture来完成。使用到CompletableFuture中的api:1.异步获取方法的返回值public static <U> CompletableFuture<U> supplyAsync(Supplier<U> suppl原创 2022-02-16 10:59:59 · 954 阅读 · 0 评论 -
BlockingQueue之ArrayBlockingQueue阻塞操作源码分析
概要BlockingQueue,是java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题 的最有用的类,它的特性是在任意时刻只有一个线程可以进行take或者put操作,并且 BlockingQueue提供了超时return null的机制,在许多生产场景里都可以看到这个工具的 身影队列类型1. 无限队列 (unbounded queue ) - 几乎可以无限增长2. 有限队列 ( bounded queue ) - 定义了最大容量队列数据结构队列实质就是原创 2021-05-07 18:23:48 · 210 阅读 · 0 评论 -
ThreadLocalRandom 在多线程环境下随机数一致问题
首先ThreadLocalRandom的出现是为了解决什么问题?就是为了解决在多线程下使用单个Random实例生成随机数时,当多个线程同时计算随机数来计算新的种子时,多个线程会竞争同一个原子变量的更新操作,由于原子变量的更新是CAS操作,同时只有一个线程会成功,所以会造成大量线程进行自旋重试,这会降低并发性能。而ThreadLocalRandom会使用初始化它的线程来填充seed,如果你把它在线程之间共享,就会导致多个线程使用相同的 seed,进而产生的随机数一样。说明白点就是用法错了,设计者的原创 2021-03-08 22:32:51 · 1661 阅读 · 0 评论 -
以ReentrantLock为例读AQS独占方法加锁解锁源码
首先,抛出一个问题什么是AQS?AQS (AbstractQueuedSynchronizer,抽象队列同步器)为线程的同步和等待等操作提供一个基础模板类。尽可能多的实现可重入锁,读写锁同步器所有需要的功能。队列同步器内部实现了线程的同步队列,独占或是共享的获取方式等,使其只需要少量的代码便可以实现目标功能。一般来说,AQS的子类应以其他类的内部类的形式存在,然后使用代理模式调用子类和AQS本身的方法实现线程的同步。以ReentrantLock举例,外界调用ReentrantLock,R原创 2021-01-20 21:20:41 · 170 阅读 · 0 评论 -
synchronized锁验证(偏向、轻量级、重量级)
看synchronized之前先了解一下对象头里面的内容:一个小demo,运行一下public class MyThred { static TestDemo testDemo; public static void main(String[] args) throws Exception { testDemo= new TestDemo(); System.out.println(ClassLayout.parseIns原创 2020-09-28 11:38:26 · 165 阅读 · 0 评论 -
基于redis实现抢红包功能(包括余额退回处理)
本文将讲述使用redis实现抢红包功能,采用发红包时将红包拆好存储,解决红包金额平衡问题(两种算法)、解决超发现象、将数据通过消息队列传递给另一个服务写入数据库。框架为:使用springboot框架实现,springboot搭建、maven配置略。一个简单的前端页面模拟并发量:两个功能:一个发红包和一个抢红包<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>原创 2020-07-22 17:17:03 · 2035 阅读 · 4 评论 -
使用jedis实现抢购功能,解决超发现象
抢购功能:在极短的时间内有大量的并发请求,出现因为并发所引起的问题。实例:一个商品100件,一个用户一次购买3件,100个用户同时购买。使用redis的String类型实现:通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃第一种:String /* redis实现,String方式 */ public void redis(int num,int i){原创 2020-07-17 16:23:22 · 223 阅读 · 0 评论 -
java 针对抢购功能对比一下悲观锁和乐观锁
抢购功能:在极短的时间内有大量的并发请求,出现因为并发所引起的问题。实例:一个商品50件,一个用户一次购买3件,100个用户同时购买。设计:mysql数据库建表语句:CREATE TABLE `product` ( `id` int(11) NOT NULL, `product_id` int(11) DEFAULT NULL, `stock` int(11) DEFAULT NULL COMMENT '库存', `version` int(255) DEFAU原创 2020-07-16 14:46:49 · 498 阅读 · 0 评论