合集-并发

摘要:BIO 同步阻塞IO 服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。 适用于连接数目小,并发小。 NIO同步非阻塞IO 服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用 阅读全文
posted @ 2022-05-31 23:16 yifanSJ 阅读(111) 评论(0) 推荐(0) 编辑
摘要:controller是线程不安全的,因为controller使用的是单例模式,不同的线程会对数据进行共享,导致数据混乱,没有实现我们想要的结果,除非定义的是常量,那就没有关系. 因为设计成单例模式的话,就不需要处理太多的gc,性能就可能得到提高 @RestController @RequestMap 阅读全文
posted @ 2022-06-01 17:39 yifanSJ 阅读(702) 评论(1) 推荐(0) 编辑
摘要:原子性:加锁(乐观锁CAS,悲观锁) 原子性是指一个操作或一系列操作要么全部执行成功并且不被中断,要么完全不执行,没有中间状态。在多线程或并发环境下,如果一个操作是原子性的,那么其他线程不会在该操作执行过程中看到该操作的部分结果。原子性是为了保证操作的一致性和正确性。例如,一个转账操作,涉及从一个账 阅读全文
posted @ 2023-07-23 18:04 yifanSJ 阅读(96) 评论(0) 推荐(0) 编辑
摘要:一、具体的实现原理 对volatile变量执行写操作时,会在写操作后加入一条store屏障指令 对volatile变量执行读操作时,会在读操作前加入一条load屏障指令 说人话: 对volatile变量执行读操作时,都要强制的先从主内存读取最新的变量值到工作内存,然后再读工作内存中所存储的变量副本 阅读全文
posted @ 2018-06-25 15:03 yifanSJ 阅读(742) 评论(0) 推荐(0) 编辑
摘要:1、为什么要有内存屏障 为了解决cpu,高速缓存,主内存带来的的指令之间的可见性和重序性问题。 我们都知道计算机运算任务需要CPU和内存相互配合共同完成,其中CPU负责逻辑计算,内存负责数据存储。CPU要与内存进行交互,如读取运算数据、存储运算结果等。由于内存和CPU的计算速度有几个数量级的差距,为 阅读全文
posted @ 2022-05-26 17:40 yifanSJ 阅读(1522) 评论(0) 推荐(2) 编辑
摘要:认识synchronized 对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方价格synchronized基本上就搞定 了,如果说不考虑性能问题的话,这一操绝对能应对百分之九十以上的情况,若对于性能方面有要求的话就需要额外的知识比如读写锁等等。本文目的先了解透彻synch 阅读全文
posted @ 2018-06-24 17:18 yifanSJ 阅读(375) 评论(0) 推荐(0) 编辑
摘要:首先说明一下,锁升级和锁降级说的根本不是一个事情,锁升级是synchronized关键字在jdk1.6之后做的优化,锁降级是为了保证数据的可见性在添加了写锁后再添加一道读锁,锁降级请参考链接1。本文主要针对锁升级介绍。 一、锁升级 之前介绍过synchronized关键字,synchronized关 阅读全文
posted @ 2022-05-30 18:50 yifanSJ 阅读(848) 评论(0) 推荐(0) 编辑
摘要:常听见有人在问这几种类型的锁有什么区别,所以整理了这篇文章。 一、自旋锁 自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区。如下: 使用了CAS原子操作,lock函数将owner设置为当前线程,并且预测原来的值为空。unlock函数将owner设置为n 阅读全文
posted @ 2022-06-01 14:22 yifanSJ 阅读(480) 评论(0) 推荐(0) 编辑
摘要:线程通信相关概述 线程间通信的模型有两种:共享内存和消息传递,下面介绍的都是围绕这两个来实现 提出问题 有两个线程A和B,B线程向一个集合里面依次添加元素“abc”字符串,一共添加10次,当添加到第五次的时候,希望线程A能够收到线程B的通知,然后B线程执行相关的业务操作 方式一:使用Object类的 阅读全文
posted @ 2023-08-25 15:41 yifanSJ 阅读(781) 评论(0) 推荐(0) 编辑
摘要:一、ThreadPoolExecutor的重要参数 1、corePoolSize:核心线程数 * 核心线程会一直存活,及时没有任务需要执行 * 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 * 设置allowCoreThreadTimeout=true(默认false)时, 阅读全文
posted @ 2022-05-30 11:54 yifanSJ 阅读(2799) 评论(0) 推荐(0) 编辑
摘要:为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证了该变量的唯一性和准确性。 1. 同步方法 即有synchronized关键字 阅读全文
posted @ 2018-06-04 11:35 yifanSJ 阅读(475) 评论(0) 推荐(0) 编辑
摘要:threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好的做法是将调用threadlocal的remove方法. 在threadlocal的生命周期中,都存 阅读全文
posted @ 2022-05-31 16:04 yifanSJ 阅读(179) 评论(0) 推荐(0) 编辑
摘要:在深入理解乐观锁与悲观锁一文中我们介绍过锁。本文在这篇文章的基础上,深入分析一下乐观锁的实现机制,介绍什么是CAS、CAS的应用以及CAS存在的问题等。 线程安全众所周知,Java是多线程的。但是,Java对多线程的支持其实是一把双刃剑。一旦涉及到多个线程操作共享资源的情况时,处理不好就可能产生线程 阅读全文
posted @ 2018-04-27 15:26 yifanSJ 阅读(347) 评论(0) 推荐(0) 编辑
摘要:1、原子类 可以实现一些原子操作 基于CAS 下面就以AtomicInteger为例。 2、AtomicInteger 在没有AtomicInteger之前,对于一个Integer的线程安全操作,是需要使用同步锁来实现的,当然现在也可以通过ReentrantLock来实现,但是最好最方便的实现方式是 阅读全文
posted @ 2018-04-22 23:35 yifanSJ 阅读(164) 评论(0) 推荐(0) 编辑
摘要:最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final ReentrantLock lock = new ReentrantLock(); lock.lock();//获取锁 阅读全文
posted @ 2018-04-24 17:57 yifanSJ 阅读(258) 评论(0) 推荐(0) 编辑
摘要:最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final ReentrantLock lock = new ReentrantLock(); lock.lock();//获取锁 阅读全文
posted @ 2018-04-24 23:46 yifanSJ 阅读(201) 评论(0) 推荐(0) 编辑
摘要:ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException。 ReentrantLock.lock方法不允许Thread.i 阅读全文
posted @ 2018-04-25 12:04 yifanSJ 阅读(959) 评论(0) 推荐(0) 编辑
摘要:先上两个图: 图一:ReentrantLock结构图 图二:公平锁和非公平锁流程图 公平锁 和 非公平锁的区别: 公平锁中,每一次的tryAcquire都会检查CLH队列中是否仍有前驱的元素,如果仍然有那么继续等待,通过这种方式来保证先来先服务的原则; 非公平锁,首先是检查并设置锁的状态,这种方式会 阅读全文
posted @ 2018-04-25 11:06 yifanSJ 阅读(289) 评论(0) 推荐(0) 编辑
摘要:注意:在阅读本文之前或在阅读的过程中,需要用到ReentrantLock 1、对于ArrayBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2、创建 public ArrayBlockingQueue(int capacity, boolean fair) pu 阅读全文
posted @ 2018-04-25 23:24 yifanSJ 阅读(158) 评论(0) 推荐(0) 编辑
摘要:1、对于LinkedBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2、创建 Node节点内部类与LinkedBlockingQueue的一些属性 static class Node<E> { E item;//节点封装的数据 /** * One of: * - 阅读全文
posted @ 2018-04-22 23:48 yifanSJ 阅读(202) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示