
并发编程
文章平均质量分 70
unhappy404
技术会过时但思维不会
展开
-
关于分布式锁的释放和spring事务提交时机不符合预期从而带来的数据不一致的问题
首先注意,本文探讨的不是分布式事务,请读者注意区分!在我们的日常开发种,分布式锁和spring事务是常见的两种控制数据一致性的方式。分布式锁和spring事务各自的作用就不做阐述了,不是本文重点,本文重点阐述一下锁释放和事务提交的问题。原创 2024-04-18 18:30:30 · 940 阅读 · 0 评论 -
xxl-job日志调度没问题日志一直报错xxl-job provider netty_http server caught exception java.io.IOException: Con
[EmbedServer$EmbedHttpServerHandler:exceptionCaught:230] [TID:N/A]: >>>>>>>>>>> xxl-job provider netty_http server caught exceptionjava.io.IOException: Connection reset by peer原创 2023-09-21 12:02:37 · 3450 阅读 · 0 评论 -
线程池的自定义策略
有一个上传任务,文件大概有数万,上传后发现有部分文件数据异常,查看日志发现有部分文件的异步事件未调用,所以猜测是否是调用的异步事件比较多,线程池阻塞队列满了。原创 2022-08-16 17:07:58 · 382 阅读 · 0 评论 -
jvm在分配内存的时候如何保证线程安全?
分配内存的时候为什么会线程不安全?因为JVM堆内存是共享的创建对象是会在多个线程中都会出现的操作线程在new对象的时候,需要拿一块内存去存放,可以理解为需要从一个空闲内存列表中拿取空闲内存。如果不做任何限制,那么多线程的场景下,极有可能出现多个线程分配到同一块内存的情况。也就是所谓的线程不安全了如何解决解决线程不安全的思想大概可以归为两类给线程不安全的方法加锁线程隔离解决方法1-加锁:一个很通用的思想就是,给线程不安全的操作加锁同样适用于分配内存如果我们给jvm堆中,分配内存这原创 2022-02-21 17:39:59 · 1781 阅读 · 0 评论 -
AQS-从线程池构造方法来学习线程池
为什么要用线程池线程的创建和销毁是很耗时的,因为要从内核态和用户态来回切换(阻塞同理),采用线程池可以避免线程处于这个生命周期,同时也能提高响应速度。为了保证线程数量在一定范围内,维护系统安全,也节省cpu资源。线程池的拒绝策略,工作队列阻塞队列原创 2021-03-24 15:14:37 · 180 阅读 · 0 评论 -
AQS-原子操作类
前言并发编程中三大要素,原子性、可见性、有序性常用的volatile也不能保证原子性unsafe类是java留下的一个后门,可以直接访问内存、设置内存屏障等CAS操作是一个针对单元素的原子操作结合以上四点,出现一个能够直接实现原子操作的类,来操作常见的数据类型就很必要了J.U.C中给我们提供了一系列这样的类,Atomic包Atomic原子更新基本类AtomicBoolean、AtomicInteger、AtomicLong原子更新数组AtomicIntegerArray 、 At原创 2021-03-24 14:28:49 · 177 阅读 · 0 评论 -
AQS-阻塞队列(责任链+synchronized+阻塞队列(生产者-消费者))
使用实例之前在学习锁的时候,其实用到过阻塞队列来实现线程间通信。比如我们要处理一个文件,分为文件校验-文件保存-文件打印三个步骤每个步骤又分为数据校验和数据处理两个阶段数据校验是一个预处理,不耗时,没有线程安全问题,是一个读处理数据处理是主要工作,会存在线程安全问题,是一个写处理我们使用责任链+synchronized+阻塞队列(生产者-消费者)来实现责任链+synchronized+阻塞队列(生产者-消费者)责任链模式的接口IRequestProcessor 和链中的数据结构Reques原创 2021-03-24 14:09:17 · 405 阅读 · 0 评论 -
AQS-ConcurrentHashMap
ConcurrentHashMap和hashmap的区别,源码解析 流程解析 ConcurrentHashMap怎么实现线程安全的原创 2021-03-23 17:51:31 · 497 阅读 · 0 评论 -
AQS-常见并发组件
Condition使用synchronized的时候,锁之间的通信靠wait/notify使用lock的时候,他们的通信靠condition.await和condition.signalcondition.await线程获得锁之后,调用await方法,会使当前线程进入等待队列(condition队列,一个区单向链表)并且从CHL队列中唤醒后继线程condition.signal获得锁的线程调用此方法,从condition队列中唤醒第一个节点线程,将其转移到AQS队列中这样使用unlock方法原创 2021-03-23 11:10:30 · 114 阅读 · 0 评论 -
AQS-ReentrantLock重入锁
Lock简介Lock是一个接口,synchronized是一个关键字,Lock比synchronized更灵活,有很多实现,更适合并发编程Lock实现ReentrantReadWriteLock读写锁维护了一对锁,一个读锁,一个写锁读锁和读锁之间共享写锁和写锁、读锁都互斥保证数据线程安全的前提下,提高了吞吐量,比单纯的互斥锁性能要好ReentrantLock重入锁ReentrantLock是关键,主要以它为例来分析ReentrantLock重入锁的设计意义类图如下值得一提的是,Syn原创 2021-03-22 17:20:13 · 120 阅读 · 0 评论 -
通过线程池的几个常用参数了解线程池大概原理
线程池大概原理为什么要使用线程池线程池的常用参数corePoolSize(核心线程数量)workQueue(任务队列)maximumPoolSize(最大线程数)RejectedExecutionHandlerkeepAliveTime为什么要使用线程池线程池(ThreadPoolExecutor)顾名思义,就是类似于连接池一样,存储线程的一个"容器",方便我们从中取线程用。而我们知道,在java中线程的创建操作就是new一个Thread,看起来很简单,那为什么还要特意放到一个池子里面去取用呢?基于原创 2021-01-04 19:10:15 · 482 阅读 · 0 评论 -
thread、threadlocal、threadLocalMap的关系、源码解读以及使用心得
目录三者的代码分析关系分析ThreadLocal用途ThreadLocal注意事项为什么要用弱引用三者的代码分析/*** 定义一个ThreadLocal单例类,来为当前运行的线程绑定一个固定的数据库连接对象(Connection)* 其实这不是严格意义上的单例,单线程内是单例的,但是多线程下就不是了。*/public class ThreadLocalOfConn { private static ThreadLocal<Connection> tl = new Thread原创 2020-11-17 18:11:29 · 1261 阅读 · 1 评论 -
关于CountDownLatch计数器和Semaphore信号量的使用和分析
先来看一道题先看力扣的一道题,提供了一个类:public class Foo { public void first() { print("first"); } public void second() { print("second"); } public void third() { print("third"); }}三个不同的线程将会共用一个 Foo 实例。线程 A 将会调用 first() 方法线程 B 将会调用 second() 方法线程 C 将会调用 third()原创 2020-11-05 15:51:03 · 187 阅读 · 1 评论 -
多线程中的安全问题
多线程中的安全问题并发编程的三个概念原子性可见性有序性保证多线程安全的手段JMMvolatile的特性valotile注意事项单例模式中的volatile并发编程的三个概念原子性与事务的原子性类似,要么都成功,要么都失败。并发中的原子性也是,要么全部执行且不被其他过程打断,要么不执行因为线程的切换是会打断一些操作的所以换个角度理解,并发编程中,具有原子性的量,同一时刻只能有一个线程来操作他,比如a=1 这种操作是原子性的,a=b,a++这种则不是java.concurrent.Atomic原创 2021-03-17 17:45:16 · 209 阅读 · 0 评论 -
CAS算法的理解与应用
CAS算法的理解与应用什么是CASCAS的开销CAS的应用什么是CASCAS:Compare and Swap,即比较再交换。主要就是三个值的比较:内存值、旧预期值、新预期值简单来说,就是线程1和线程2同时从内存中拿到了一个变量a=1(内存值)此时两个线程各有一份拷贝的a的值,均为1(旧预期值)。线程1把a改成了2,进行比较,发现内存值1=旧的预期值1,说明这个时间段没人改过,直接把修改写入内存。线程2想把a改成3,比较发现,内存值2 != 旧的预期值1,说明这个时间段有人改过了a的值,这次修原创 2021-03-15 17:45:49 · 349 阅读 · 0 评论 -
多线程原理之synchronized锁的原理
锁的存储结构markoop,锁的分类偏向锁轻量级锁重量级锁,锁的升级,为什么叫重量级锁?为什么叫轻量级锁,他们的区别原创 2021-03-15 18:55:59 · 446 阅读 · 0 评论 -
多线程原理之Synchronized的初步使用
多线程原理之Synchronized的初步使用线程安全问题的例子解决线程安全的办法锁类对象锁类实例锁变量为什么每个对象都可以当锁锁存在哪里多线程很容易的一个点就是共享变量的使用,容易引发线程安全问题线程安全问题的例子public class ThreadSyn { private static int count = 0; public static void inc(){ try{ // 加长一段线程执行的时间,不然count++的速度远原创 2021-03-15 16:56:03 · 93 阅读 · 0 评论 -
多线程与并发一基础知识
多线程与并发一基础知识线程的实现线程的好处应用场景线程的状态线程的实现继承Thread类(本质就是一个Runnable的实现类)public class ThreadTest1 extends Thread{ @Override public void run(){ System.out.println("thread by extend Thread"); }}public class ThreadMain { public static v原创 2021-03-11 19:10:15 · 97 阅读 · 0 评论 -
多线程、并发、并行、同步异步等基础信息
多线程、并发、并行、同步异步等基础信息多线程并发并行同步异步多线程和异步的区别多线程线程是一个逻辑上的概念,说白了就是一段运行的代码并发并发是单处理器处理多个任务,通过时间片的轮询来达到微观上的串行,宏观上的并行并行多个处理器同时进行,不管微观还是宏观都是并行同步程序和程序之间排队轮流执行,一个完了又一个异步程序和程序之间不是轮流的,但也不是完全没关系的。A程序在做一件事情的时候,B程序去做另一件事,彼此不耽误,做完之后通过回调函数再进行互动。多线程和异步的区别多线程就是一个纯逻辑上原创 2021-03-11 10:54:10 · 240 阅读 · 0 评论 -
AQS-简介
J.U.CJ.U.C就是java.util.concurrent的简称,java并发工具包,里面有很多多线程并发编程的工具类。比如线程池、阻塞队列、计时器、同步器、并发集合等AQSAQS全程AbstractQueuedSynchronizer,是juc包下的一个类,是一个实现了FIFO的队列,底层的数据结构是一个双向列表,是JUC中很多工具类的实现基础和核心思想。核心思想AQS的核心思想就是,如果线程请求获取共享资源时,根据一个state状态量来判断资源是否空闲如果资源空闲(state=0),把原创 2021-03-22 14:38:58 · 277 阅读 · 0 评论