Java高并发
文章平均质量分 85
福建选手阿俊
在无人问津的地方训练,在万众瞩目的地方出现
展开
-
为什么启动一个线程是start方法而不是run方法
文章目录1:一个例子来说明你是否启动一个线程2:从源码角度看调用start方法为什么会启动一个线程1:一个例子来说明你是否启动一个线程看下面代码演示,我们使用Thread.currentThread().getName()来打印当前线程名字public class ThreadStartAndRun { public static void main(String[] args) { new Thread(()->{ for (int i=0;i&原创 2021-05-05 18:51:00 · 330 阅读 · 4 评论 -
JUC——并发容器ConcurrentLinkedQueue源码解读
文章目录1:ConcurrentLinkedQueue的介绍1.1 初始化分析1.2 入队列分析1.3 出队列情况分析1.4 队列判空分析2:使用debug进行源码分析1:ConcurrentLinkedQueue的介绍ConcurrentLinkedQueue 的实现 原理:是基于 CAS,通过head/ail指针记录队列头部和尾部。首先,它是一个单向链表,定义如下。public class ConcurrentLinkedQueue<E> extends AbstractQueue&原创 2021-04-15 11:50:21 · 251 阅读 · 2 评论 -
JUC——并发容器ConcurrentHashMap源码解读
文章目录1:JDK1.8中ConcurrentHashMap的实现方式1.1 构造函数分析1.2 初始化分析1.3 put方法分析1.4 get方法分析HashMap通常的实现方式是“数组”+“链表”,这种方式被称为拉链法。HashMap源码解读ConcurrentHashMap在这个基本原理上进行了各种优化,在JDK1.7和JDK1.8中的实现有很大差异。我在这里只说在JDK1.8中的实现方式。ConcurrentHashMap是一个高效的并发HashMap,可以把它理解为一个线程安全的HashMa原创 2021-04-15 01:28:07 · 374 阅读 · 1 评论 -
ThreadPool线程池——线程复用——超级详细骗
文章目录1:线程池介绍2:JDK对线程池的支持——Executor3:核心线程池的内部实现——ThreadPoolExecutor4:拒绝策略——RejectedExecutionHandler——超负载解决办法5:ThreadFactory——自定义线程创建6:优化线程池数量多线程的软件设计方法确实可以最大限度地发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能。但是,若不加控制和管理,随意使用线程,对系统的性能反而会产生不利的影响。 Thread thread = new Thread(ne原创 2021-04-13 01:26:34 · 693 阅读 · 9 评论 -
线程池——线程池创建的5种方法
文章目录1 newFixedThreadPool 方法2 newSingleThreadExcutor方法3 newCachedThreadPool方法4 newSingleThreadScheduledExecutor方法5 newScheduledThreadPool方法1 newFixedThreadPool 方法newFixedThreadPool() 方法:该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的原创 2021-04-13 01:25:04 · 1366 阅读 · 1 评论 -
线程池——ThreadFactory——自定义线程创建
大家有没有想过 线程池中的线程是从哪里来的呢?之前介绍过,线程池的主要作用是为了线程复用,也就是避免了线程的频繁创建,但是,最开始的那些线程从何而来呢?答案就是ThreadFactory(根据需要创建新线程的对象。使用线程工厂,允许应用程序使用特殊的线程子类、优先级等。)ThreadFactory 是一个接口,它只有一个用来创建线程的方法。Thread newThread (Runnable r);//r:一个由新的线程实例执行的可运行程序当线程池需要新建线程时,就会调用这个方法。自定义线程池原创 2021-04-13 01:22:26 · 3945 阅读 · 1 评论 -
线程池——拒绝策略——RejectedExecutionHandler——超负载解决办法
1:拒绝策略——超负载解决办法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Ru原创 2021-04-13 01:21:15 · 1931 阅读 · 1 评论 -
JUC——并发容器BlockingQueue数据共享通道源码解析
文章目录1:BlockingQueue数据共享通道介绍2:BlockingQueue的用处3:BlockingQueue的核心方法4:BlockingQueue工作机制——源码解析5:BlockingQueue实现生产者消费者模式1:BlockingQueue数据共享通道介绍对于并发程序而言,高性能自然是个我们需要追求的目标,但多线程的开发模式还会引入一个问题,那就是如何进行多个线程间的数据共享呢?比如,线程A希望给线程B发一条消息,用什么方式告知线程B是比较合理的呢?一般来说,我们总是希望整个系统是原创 2021-04-12 15:28:46 · 275 阅读 · 2 评论 -
JUC——ReadWriteLock读写锁
文章目录1:ReadWriteLock读写锁介绍2:ReadWriteLock读写锁演示1:ReadWriteLock读写锁介绍ReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有效地帮助减少锁竞争,提升系统性能。用锁分离的机制来提升性能非常容易理解,比如线程A1、 A2. A3进行写操作,B1、B2、B3进行读操作,如果使用重入锁或者内部锁,从理论上说所有读之间、读与写之间、写和写之间都是串行操作。当B1进行读取时,B2、 B3 则需要等待锁。由于读操作并不对数据的完整性造成破坏,原创 2021-04-11 22:25:05 · 222 阅读 · 0 评论 -
JUC——JUC强大辅助类讲解
文章目录1:JUC是什么2:倒计数器——CountDownLatchDemo3:循环栅栏——CyclicBarrier4:允许多个线程同时访问——Semaphore(信号量)1:JUC是什么JUC全名java.util.concurrent是一种在并发编程中使用的工具类JUC主要是三大包构成:并发包,并发原子包,并发lock包如下介绍的三种辅助类都是在java.util.concurrent包下2:倒计数器——CountDownLatchDemoCountDownLatch是一个非常实用的多线原创 2021-04-11 21:26:31 · 387 阅读 · 1 评论 -
JUC包——并发容器CopyOnWriteArrayList类的源码解析——高效读取
文章目录1:CopyOnWriteArrayList源码解析1.1 源码解析1:CopyOnWriteArrayList源码解析CopyOnWriteArrayList:ArrayList的线程安全变体,其中所有可变操作(添加、设置等)都是通过创建底层数组的新副本来实现的。(写时复制是读写分离思想的一种体现)ArrayList的线程安全变体,其中所有可变操作(添加、设置等)都是通过创建底层数组的新副本来实现的。生活例子每一个同学都要进行花名册签到,会出现什么情况呢?正常情况下,老师会按顺序给同原创 2021-04-11 01:14:34 · 223 阅读 · 0 评论 -
线程安全概念与关键字synchronized
文章目录1:线程安全重要性2:关键字synchronized1:线程安全重要性并行程序开发的一大关注重点就是线程安全。一 般来说, 程序并行化是为了获得更高的执行效率,但前提是,高效率不能以牺牲正确性为代价。如果程序并行化后,连基本的执行结果的正确性都无法保证,那么并行程序本身也就没有任何意义了。因此,线程安全就是并行程序的根基。大家还记得那个多线程读写long型数据的案例吧!它就是一个典型的反例。但在使用volatile 关键字后,这种错误的情况有所改善。但是,volatile 关键字并不能真正保证线原创 2021-04-10 11:26:02 · 793 阅读 · 1 评论 -
线程间通信——等待(wait)和通知(notify)
文章目录1:等待(wait)和通知(notify)的介绍2:等待(wait)和通知(notify)的执行机制1:等待(wait)和通知(notify)的介绍JDK提供了两个非常重要的接口线程:等待wait()方法和通知notify()方法。这两个方法在Object类中,意味着任何对象都可以调用这两个方法。方法签名如下public final void wait() throws InterruptedException {public final native void notify();当在一原创 2021-04-10 10:32:41 · 791 阅读 · 0 评论 -
Java高并发——走入并行世界——第一章
文章目录1:为什么需要并行2:有关并行必须知道的几个概念3:并发级别4:有关并行的两个重要定律5: 回到Java:JMM1:为什么需要并行Linus是一个传奇的人物,是他给出了Linux的原型,并且一直致力于推广和发展Linux系统。1991年,他在网络上发布Linux源码,从此Linux迅速崛起壮大,成为目前最广泛的操作系统之一。由于他和BitMover之间的分歧,因此Linus决定自行研发版本控制工具,于是,Git诞生了。正是这位传奇人物,给目前红红火火的并行计算泼了一个凉水,他说到:并行计算只可原创 2021-01-31 23:25:34 · 218 阅读 · 1 评论