多线程高并发
文章平均质量分 92
多线程高并发
知行合一。。。
这个作者很懒,什么都没留下…
展开
-
提升--23---CopyOnWrite容器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。原创 2023-12-05 11:36:06 · 82 阅读 · 0 评论 -
提升--22---ReentrantReadWriteLock读写锁
现实中有这样一种场景对共享资源有读和写的操作,且写操作没有读操作那么频繁(读多写少)在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源(读读可以并发)但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写操作了(读写,写读,写写互斥)在读多于写的情况下,读写锁能够提供比排它锁更好的并发性和吞吐量。针对这种场景,JAVA的并发包提供了读写锁,它内部,维护了一对相关的锁,一个用于只读操作,称为读锁;一个用于写入操作,称为写锁。原创 2023-12-05 10:14:34 · 914 阅读 · 0 评论 -
提升--21---JMM(Java内存模型)
JMM 是Java内存模型(),简称JMM。它本身只是一个抽象的概念,并不真实存在,它描述的是一种规则或规范,内存模型描述了程序中各个变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节JMM 和 JVM的内存结构,不是一个东西!!!!原创 2023-12-04 20:04:25 · 111 阅读 · 0 评论 -
提升--20---Disruptor-----号称最快的消息队列
文章目录DisruptorDisruptor原创 2021-10-03 21:40:37 · 1456 阅读 · 0 评论 -
提升--19---JMH-----Java准测试工具套件
文章目录JMH定义:JMH -java Microbenchmark Harness------微基准测试[官网 http://openjdk.java.net/projects/code-tools/jmh/](http://openjdk.java.net/projects/code-tools/jmh/)创建JMH测试1.创建Maven项目,添加依赖2. idea安装JMH插件3. 由于用到了注解,打开运行程序注解配置4. 定义需要测试类PS (ParallelStream)测试方法的吞吐量 ,1s运原创 2021-10-03 10:47:22 · 5233 阅读 · 0 评论 -
提升--18---线程池--05----keepAliveTime
提升–17—线程池–03----ThreadPoolExecutor源码解析4、提交执行task的过程----execute()/**/// worker数量比核心线程数小,直接创建worker执行任务return;// worker数量超过核心线程数,任务直接进入队列// 线程池状态不是RUNNING状态,说明执行过shutdown命令,需要对新加入的任务执行reject()操作。// 这儿为什么需要recheck,是因为任务入队列前后,线程池的状态可能会发生变化。if (!原创 2023-12-26 21:56:12 · 1015 阅读 · 0 评论 -
提升--18---线程池--04----WorkStealingPool 、ForkJoinPool
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录WorkStealingPool原理WorkStealing指的是和原来线程池的区别,==每一个线程都有自己单独队列==应用场景源码本质上他是一个ForkJoinPoolForkJoinPool原理:ForkJoinPool是这样一种线程池,它适合把大任务==切分==成一个一个的小任务去运行,小任务还是觉得比较大,再切,不一定是两个,也可以切成三个四个。切完这个任务执行完了要进行一个==汇总==.ForkJoinTaskRecurs原创 2021-10-02 19:41:14 · 355 阅读 · 1 评论 -
提升--17---线程池--03----ThreadPoolExecutor源码解析
文章目录ThreadPoolExecutor源码解析1、常用变量的解释1 ` ctl`,可以看做一个int类型的数字,==高3位表示线程池状态,低29位表示worker数量==4. ==线程池有5种状态==,按大小排序如下:RUNNING < SHUTDOWN < STOP < TIDYING < TERMINATED在下面就是对ctl的一些操作了runStateOf取他的状态,workerCountOf计算有多少个线程正在工作,还有第8和第9个runStateLessThan、ru原创 2021-10-02 13:59:02 · 129 阅读 · 0 评论 -
提升--16---线程池--02---线程池7大参数、Executors工具类
文章目录线程池参数线程池参数原创 2021-10-01 16:47:48 · 342 阅读 · 0 评论 -
提升--15---线程池--01---基本概念、Callable、Future、CompletableFuture
文章目录线程池---基本概念多线程--08--线程池1. Executor--ExecutorService--ThreadPoolExecutorExecutorExecutorServicesubmit()方法==submit提交任务==: 把任务扔给这个线程池,什么时候运行由这个线程池来决定,相当于是异步的,Callable---接口流程:案例1:Callable的实现类案例2: Callable实现类结合线程池如何理解实现Callable接口的方式比实现Runnable接口创建多线程方式强大?Fut原创 2021-09-30 20:58:40 · 363 阅读 · 0 评论 -
提升--14---华为面试题: 交替输出,顺序打印
文章目录多线程--08--线程池华为的一道面试题需求方法1: wait、notify和notifyAll注意:如果两个方法都使用在同步代码块或同步方法中,==sleep()不会释放锁,wait()会释放锁==。思考方法2: condition.signal(); condition.await();两个Condition会更好方法3: LockSupport多线程–08–线程池华为的一道面试题需求这个面试题是两个线程,第一个线程是从1到26,第二个线程是从A到一直到Z,然后要让这两个线程做到原创 2021-09-27 23:08:41 · 285 阅读 · 0 评论 -
提升--13---ConcurrentHashMap、ConcurrentSkipListMap、 CopyOnWrite、各种Queue
文章目录1. ConcurrentHashMapJDK1.7版本的CurrentHashMap的实现原理Segment(分段锁)-减少锁的粒度内部结构该结构的优劣势JDK1.8版本的CurrentHashMapCASvolatile小结Map1. ConcurrentHashMap主要就是为了应对hashmap在并发环境下不安全而诞生的,ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响。我们都知原创 2021-09-25 20:31:48 · 657 阅读 · 0 评论 -
提升--12---并发容器历史
文章目录容器java容器分2大类Collection集合Map从数据结构角度分:Collection 分三大类Queue队列list,set和队列 Queue的区别容器java容器分2大类第一大类:Collection叫集合第二大类:MapCollection集合第一大类Collection叫集合。集合的意思是不管你这个容器是什么结构你可以把一个元素一个元素的往里面扔;Map第二大类Map:Map是一对一对的往里扔,kv结构。其实Map来说可以看出是Collection一个特殊的原创 2021-09-25 11:40:13 · 153 阅读 · 0 评论 -
提升--11---java的四种引用:强软弱虚
文章目录java的四种引用:强软弱虚什么是一个引用?Object o = new Object()这就是一个引用1. 强引用==只要有一个应用指向这个对象,那么垃圾回收器一定不会回收它==,这就是普通的引用,也就是强引用,2. 软引用我们来说一下软引用的含义,当有一个对象(字节数组)被一个软引用所指向的时候,==只有系统内存不够用的时候,才会回收它(字节数组)==设置堆内存 -Xms20m -Xmx20m分析;应用:软引用的使用场景:做==缓存用==,这个东西主要做缓存用3. 弱引用弱引用的意思是,==只原创 2021-09-21 15:15:49 · 283 阅读 · 2 评论 -
提升--10---ThreadLocal简介
文章目录ThreadLocal 简介概念1. ThreadLocal类2.ThreadLocal静态类部类----ThreadLocalMap3.Thread类中属性threadLocals:ThreadLocal是线程Thread中属性threadLocals的管理者。举个栗子作用:Synchronized用于线程间的数据共享,而ThreadLocal则用于==线程间的数据隔离==。用法案例:ThreadLocal 源码解析ThreadLocal源码的set方法这个时候我们应该明白,map的set方法其实原创 2021-09-21 14:41:53 · 249 阅读 · 0 评论 -
提升--09-1--AQS底层逻辑实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。原创 2023-11-21 21:57:55 · 111 阅读 · 0 评论 -
提升--09---AQS源码解析--(抽象的队列式同步器)
文章目录ReentrantLock---源码解析以下jdk版本----==JDK11==案例debugUML图debug开始ReentrantLockNonfairSyncAbstractQueuedSynchronizer----(AQS)NonfairSync ==> Sync ==> AQS(AbstractQueuedSynchronizer)tryAcquire(1)nonfairTryAcquireAQS----源码解析AQS队列又可以称为CLH队列1.state==AQS的核心是什原创 2021-09-20 19:09:03 · 272 阅读 · 2 评论 -
提升--08---LockSupport、淘宝面试题
文章目录LockSupport背景:概念;案例解析1:案例解析2:由此可以看出,LockSupport的unpark()方法可以先于LockSupport的park()方法执行。案例解析3:小结:LockSupport中park()和unpark()方法的实现原理LockSupport背景:我们会以几个小程序为案例,展开对LockSupport的讲解,在以前我们要阻塞和唤醒某一个具体的线程有很多限制比如:因为wait()方法需要释放锁,所以必须在synchronized中使用,否则会抛出异常I原创 2021-09-12 12:54:54 · 276 阅读 · 0 评论 -
提升--07---Atomic类、LongAdder 、CountDownLatch、CyclicBarrier、Phaser、ReadWriteLock、Semaphore、Exchanger
https://blog.csdn.net/shihuacai/article/details/8856370?https://blog.csdn.net/heihaozi/article/details/105738230?原创 2021-09-09 00:43:49 · 217 阅读 · 0 评论 -
提升--06---解析Synchronized锁升级
Synchronized锁升级多线程–10–偏向锁、轻量级锁、重量级锁、volatile基础知识1. CAS算法即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数需要读写的内存值 V进行比较的值 A拟写入的新值 BCAS详情 提升–05—并发编原创 2021-08-29 22:32:59 · 249 阅读 · 2 评论 -
提升--05---并发编程之---原子性---CAS
并发编程之原子性原创 2021-08-28 23:05:44 · 542 阅读 · 0 评论 -
提升--04---并发编程之---有序性---volatile两大作用
并发编程之有序性经典案例1:import java.util.concurrent.CountDownLatch;public class T01_Disorder { private static int x = 0, y = 0; private static int a = 0, b = 0; public static void main(String[] args) throws InterruptedException { for (lon原创 2021-08-26 23:46:40 · 329 阅读 · 0 评论 -
提升--03---并发编程之---可见性
并发编程三大特性可见性先看一个小案例:import java.io.IOException;public class T01_HelloVolatile { private static boolean running = true; private static void m() { System.out.println("m start"); while (running) { } System.out.p原创 2021-08-25 00:33:14 · 183 阅读 · 0 评论 -
提升--02---线程的打断(interrupt)--线程的结束
线程的打断(interrupt)interrupt相关的三个方法:interrupt只是设置标志位,并不是真的断开线程public void interrupt() //t.interrupt()打断t线程(设置t线程某给标志位f=true,并不是打断线程的运行)public boolean isInterrupted() //t.isInterrupted()查询打断标志位是否被设置(是不是曾经被打断过)public static boolean int原创 2021-08-23 00:07:30 · 723 阅读 · 1 评论 -
提升--01---线程基础知识--程序、进程、线程--线程池中的线程数量设置多少合适?
线程基础知识原创 2021-08-18 21:58:49 · 1956 阅读 · 2 评论 -
多线程--11--ConcurrentHashMap
其实可以看出JDK1.8版本的ConcurrentHashMap的数据结构已经接近HashMap,相对而言,ConcurrentHashMap只是增加了同步的操作来控制并发,从JDK1.7版本的,到JDK1.8版本中synchronized+CAS+HashEntry+红黑树。数据结构:取消了Segment分段锁的数据结构,取而代之的是数组+链表+红黑树的结构。保证线程安全机制:JDK1.7采用segment的分段锁机制实现线程安全,其中segment继承自ReentrantLock。JDK1.8采用。原创 2023-12-05 20:02:07 · 134 阅读 · 0 评论 -
多线程--10--偏向锁、轻量级锁、重量级锁、volatile
https://blog.csdn.net/lengxiao1993/article/details/81568130?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control原创 2020-12-10 16:20:12 · 2486 阅读 · 0 评论 -
多线程--09--悲观锁与乐观锁 CAS
多线程–09–悲观锁与乐观锁原创 2020-11-17 17:16:29 · 157 阅读 · 0 评论 -
多线程--08--线程池
https://www.jianshu.com/p/7726c70cdc40原创 2020-11-17 10:28:43 · 285 阅读 · 1 评论 -
多线程--07--生产者 /消费者模型
经典例题:生产者 /消费者问题业务背景:分析:是否是多线程问题?是,生产者线程,消费者线程是否有共享数据?是,店员(或产品)如何解决线程的安全问题?同步机制,有三种方法是否涉及线程的通信?是...原创 2020-11-16 14:48:20 · 85 阅读 · 0 评论 -
多线程--06--死锁的问题
多线程–06–死锁的问题原创 2020-11-16 14:49:15 · 124 阅读 · 0 评论 -
多线程--05--线程安全问题---售票模型--synchronized--Lock锁
案例1:创建三个窗口卖票,总票数为100张.使用继承Thread类的方式class Window extends Thread{ private static int ticket = 100; @Override public void run() { while(true){ if(ticket > 0){ System.out.println(getName() + ":卖票,票号为:"原创 2020-11-13 15:29:59 · 440 阅读 · 0 评论 -
多线程--04--线程的生命周期
线程的生命周期public enum Stat{ } 内部内枚举类线程生命周期,总共有五种状态:新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;运行状态(Running):当CPU开始原创 2020-11-12 17:08:30 · 411 阅读 · 0 评论 -
多线程--03--Thread中的常用方法
Thread中的常用方法概述Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。Start()方法是一个native方法,它将通知底层操作系统,最终由操作系统启动一个新线程,操作系统将执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。Thread中的常用方法start():启动当前线程;调用当前线原创 2020-11-12 17:09:21 · 728 阅读 · 5 评论 -
多线程--02--线程的创建和使用
线程的创建和使用继承于Thread类实现Runnable接口CallablePool方式一:继承于Thread类创建一个继承于Thread类的子类重写Thread类的run() --> 将此线程执行的操作声明在run()中创建Thread类的子类的对象通过此对象调用start()例子:遍历100以内的所有的偶数class MyThread extends Thread { @Override public void run() {原创 2020-11-16 19:30:40 · 529 阅读 · 0 评论 -
多线程--01--程序、进程、线程
计算机 —电子存储程序计算机:是一种能够存储一系列指令,接收输入,处理数据,存储数据并产生输出的设备.软件:按照特定顺序组织的计算机数据和指令集合程序、进程、线程原创 2020-11-11 15:53:24 · 141 阅读 · 0 评论