TyuIn
热爱编程#
展开
-
JUC学习 - 锁升级
一、synchronized 的简单回顾synchronized 锁有四种状态,无锁、偏向锁、轻量级锁、重量级锁。这几个状态会随着竞争状态逐渐升级,锁可以升级但不能降级,但是偏向锁状态可以被重置为无锁状态。二、锁升级1、偏向锁经过 HotSpot 的作者大量的研究发现大多数时候是不存在锁竞争的,经常是一个线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要付出的代价,为了降低获取锁的代价,才引入的偏向锁。核心思想:如果一个线程获得了锁,那么锁就进入偏向模式,此时 Mark Word原创 2021-12-07 21:44:00 · 712 阅读 · 0 评论 -
JUC学习 - 深入剖析线程池(ThreadPoolExecutor)(补)
接上一篇博客 https://blog.youkuaiyun.com/qq_43605444/article/details/121727738?spm=1001.2014.3001.55016、Worker 类下面的是在 Worker 类上的官方的一段注释:/** * Class Worker mainly maintains interrupt control state for * threads running tasks, along with other minor bookkeeping.原创 2021-12-05 15:53:48 · 787 阅读 · 0 评论 -
JUC学习 - 深入剖析线程池(ThreadPoolExecutor)
一、ThreadPoolExecutor 的认识Java中的线程池核心实现类是ThreadPoolExecutor,本章基于JDK 1.8的源码来分析Java线程池的核心设计与实现。我们首先来看一下ThreadPoolExecutor的UML类图,了解下ThreadPoolExecutor的继承关系。ThreadPoolExecutor实现的顶层接口是Executor,顶层接口Executor提供了一种思想:将任务提交和任务执行进行解耦。用户无需关注如何创建线程,如何调度线程来执行任务,用户只需提供R原创 2021-12-05 12:40:19 · 506 阅读 · 0 评论 -
JUC学习 - AbstractQueuedSynchronizer源码解读(AQS)(补)
接上一篇博客 https://blog.youkuaiyun.com/qq_43605444/article/details/121705312?spm=1001.2014.3001.55013、release(int) 方法release(int)方法是独占模式下线程释放共享资源的顶层入口。它会释放指定量的资源,如果彻底释放了(即state=0),它会唤醒等待队列里的其他线程来获取资源。这也正是unlock()的语义,当然不仅仅只限于unlock()。下面是release()的源码: /** *原创 2021-12-03 20:01:28 · 424 阅读 · 0 评论 -
JUC学习 - AbstractQueuedSynchronizer源码解读(AQS)
一、AbstractQueuedSynchronizer的认识AbstractQueuedSynchronizer抽象队列同步器简称AQS,它是实现同步器的基础组件,juc下面Lock的实现以及一些并发工具类就是通过AQS来实现的。AQS会把所有的请求线程构成一个CLH队列,当一个线程执行完毕(lock.unlock())时会激活自己的后继节点,但正在执行的线程并不在队列中,而那些等待执行的线程全部处于阻塞状态(park())。【关于CLH队列的描述,参考:https://blog.youkuaiyun.com/f原创 2021-12-03 19:40:45 · 632 阅读 · 0 评论 -
JUC学习 - 阻塞队列1
6、PriorityBlockingQueue一个支持优先级排序的无界阻塞队列,进入队列的元素会按照优先级进行排序。public class PriorityBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable无界的优先级阻塞队列,内部使用数组存储数据,达到容量时,会自动进行扩容,放入的元素会按照优先级进行排序,4个构造方法:原创 2021-12-02 21:11:53 · 317 阅读 · 0 评论 -
JUC学习 - 阻塞队列
1、Queue接口队列是一种先进先出(FIFO)的数据结构,JAVA中用Queue接口来表示队列。Queue接口中定义了6个方法:public interface Queue<E> extends Collection<E> { boolean add(e); boolean offer(E e); E remove(); E poll(); E element(); E peek();}每个Queue方法都有两种形式:(原创 2021-12-02 20:51:22 · 395 阅读 · 0 评论 -
JUC学习 - 线程6种状态详解
1、线程状态分类线程一共有六种状态,分别为New、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED,同一时刻只有一种状态,通过线程的getState方法可以获取线程的状态。2、状态详解Thread的状态使用java.lang.Thread.State枚举表示。public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMI原创 2021-12-01 21:08:57 · 552 阅读 · 0 评论 -
JUC学习 - 实战:一起来搞懂限流
1、常见的限流的场景秒杀活动,数量有限,访问量巨大,为了防止系统宕机,需要做限流处理国庆期间,一般的旅游景点人口太多,采用排队方式做限流处理医院看病通过发放排队号的方式来做限流处理。2、常见的限流算法通过控制最大并发数来进行限流使用漏桶算法来进行限流使用令牌桶算法来进行限流3、通过控制最大并发数来进行限流以秒杀业务为例,10个iphone,100万人抢购,100万人同时发起请求,最终能够抢到的人也就是前面几个人,后面的基本上都没有希望了,那么我们可以通过控制并发数来实现,比如并发数原创 2021-12-01 19:37:46 · 281 阅读 · 0 评论 -
JUC学习 - 延迟队列 DelayQueue 详解
1、DelayQueue基本特征public class DelayQueue<E extends Delayed> extends AbstractQueue<E> implements BlockingQueue<E>DelayQueue延迟队列同时具备:无界队列、阻塞队列、优先队列的特征。分别来看下:无界队列:通过调用DelayQueue的offer方法(或add方法),把待执行的任务对象放入队列,该方法是非阻塞的。这个队列是无界队列,内存足够的情原创 2021-12-01 19:02:46 · 843 阅读 · 0 评论 -
JUC学习 - 原子操作增强类LongAdder、LongAccumulator
我们来模拟50个线程,每个线程对计数器递增100万次,最终结果应该是5000万。我们使用4种方式实现,看一下其性能,然后引出为什么需要使用LongAdder、LongAccumulator。1、方式一:synchronized 方式实现public class MakeTheCounter { static int count = 0; public static synchronized void incr() { count++; }原创 2021-11-30 22:52:39 · 381 阅读 · 0 评论 -
JUC学习 - 回顾
通过一个简单的实例对前面学过的知识做一个简单回顾。原创 2021-11-30 20:33:08 · 378 阅读 · 0 评论 -
JUC学习 - 原子操作类
一、JUC中的原子操作类1、JUC中原子类介绍什么是原子操作?atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰,所以,所谓原子类说简单点就是具有原子操作特征的类,原子操作类提供了一些修改数据的方法,这些方法都是原子操作的,在多线程情况下可以确保被修改数据的正确性。JUC中对原子操作提供了强大的支持,这些类位于j原创 2021-11-27 19:09:47 · 176 阅读 · 0 评论 -
JUC学习 - java中的UnSafe类1
接上一篇博客6、park和unpark示例代码如下:public class UnsafeDemo { static Unsafe unsafe; static { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); unsafe = (Unsafe) fiel原创 2021-11-27 00:42:10 · 178 阅读 · 0 评论 -
JUC学习 - java中的UnSafe类
一、java中的UnSafe类1、基本介绍juc中大部分类都是依赖于Unsafe来实现的,主要用到了Unsafe中的CAS、线程挂起、线程恢复等相关功能。所以如果打算深入了解JUC原理的,必须先了解一下Unsafe类。先上一幅Unsafe类的功能图:...原创 2021-11-27 00:24:22 · 863 阅读 · 0 评论 -
JUC学习 - java中的CAS
一、java中的CAS1、我们需要解决的问题需求:我们开发了一个网站,需要对访问量进行统计,用户每次发一次请求,访问量+1,如何实现呢?下面我们来模仿有100个人同时访问,并且每个人对咱们的网站发起10次请求,最后总访问次数应该是1000次。实现访问如下。方式1代码如下:public class CountTheNumberOfRequest { //访问次数 static int count = 0; //模拟访问一次 public static原创 2021-11-26 22:55:55 · 279 阅读 · 0 评论 -
JUC学习 - Executor框架详解2
一、JUC中的Executor框架详解21、需要解决的问题还是举个例子说明更好理解一些。买新房了,然后在网上下单买冰箱、洗衣机,电器商家不同,所以送货耗时不一样,然后等他们送货,快递只愿送到楼下,然后我们自己将其搬到楼上的家中。用程序来模拟上面的实现。示例代码如下:public class SceneTest { static class GoodsModel { //商品名称 private String name; //购物开始原创 2021-11-26 22:39:23 · 129 阅读 · 0 评论 -
JUC学习 - Executors框架详解1
接上一篇博客https://blog.youkuaiyun.com/qq_43605444/article/details/121569162?spm=1001.2014.3001.55017、Future、Callable接口Future接口定义了操作异步任务执行的一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。Callable接口中定义了需要有返回的任务需要实现的方法。@FunctionalInterfacepublic interface Callable原创 2021-11-26 22:13:03 · 563 阅读 · 0 评论 -
JUC学习 - Executors框架详解1
一、JUC中的Executor框架详解1、Executors框架介绍Executors框架是Doug Lea的神作,通过这个框架,可以很容易的使用线程池高效地处理并行任务。Executors框架主要包含3部分的内容:任务相关的:包含被执行的任务要实现的接口:Runnable接口或Callable接口任务的执行相关的:包含任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。Executor框架中有两个关键的类实现了ExecutorService接原创 2021-11-26 21:48:17 · 351 阅读 · 0 评论 -
JUC学习 - 线程池2
接上一篇博客https://blog.youkuaiyun.com/qq_43605444/article/details/121568416?spm=1001.2014.3001.55018、4种常见饱和策略当线程池中队列已满,并且线程池已达到最大线程数,线程池会将任务传递给饱和策略进行处理。这些策略都实现了RejectedExecutionHandler接口。接口中有个方法:void rejectedExecution(Runnable r, ThreadPoolExecutor executor)参数原创 2021-11-26 21:09:32 · 308 阅读 · 0 评论 -
JUC学习 - 线程池1
一、线程池1、什么是线程池大家用jdbc操作过数据库应该知道,操作数据库需要和数据库建立连接,拿到连接之后才能操作数据库,用完之后销毁。数据库连接的创建和销毁其实是比较耗时的,真正和业务相关的操作耗时是比较短的。每个数据库操作之前都需要创建连接,为了提升系统性能,后来出现了数据库连接池,系统启动的时候,先创建很多连接放在池子里面,使用的时候,直接从连接池中获取一个,使用完毕之后返回到池子里面,继续给其他需要者使用,这其中就省去创建连接的时间,从而提升了系统整体的性能。线程池和数据库连接池的原理也差不多原创 2021-11-26 20:59:10 · 371 阅读 · 0 评论 -
JUC学习 - 循环栅栏CyclicBarrier
一、JUC中的循环栅栏CyclicBarrier1、CyclicBarrier简介CyclicBarrier通常称为循环屏障。它和CountDownLatch很相似,都可以使线程先等待然后再执行。不过CountDownLatch是使一批线程等待另一批线程执行完后再执行;而CyclicBarrier只是使等待的线程达到一定数目后再让它们继续执行。故而CyclicBarrier内部也有一个计数器,计数器的初始值在创建对象时通过构造参数指定,如下所示:public CyclicBarrier(int par原创 2021-11-26 20:48:52 · 451 阅读 · 0 评论 -
JUC学习 - CountDownLatch
一、JUC中的CountDownLatch思考一个需求假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要统计解析总耗时。分析一下:解析每个sheet耗时可能不一样,总耗时就是最长耗时的那个操作。我们能够想到的最简单的做法是使用join,代码如下:public class ThreadTest { public static class T extends T原创 2021-11-26 08:27:44 · 325 阅读 · 0 评论 -
JUC学习 - Semaphore(信号量)
一、JUC中的Semaphore(信号量)1、Semaphore简介Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的我们学了synchronized、重入锁ReentrantLock,这两种锁一次都只能允许一个线程访问一个资源,而信号量可以控制有多少个线程可以同时访问特定的资源。2、Semaphore常用场景:限流举个例子:比如有个停车场,有5个空位,门口有个门卫,手中5把钥匙分别对应5个车位上面的锁,来一辆车,门卫会给司机一把钥匙,然后进去找到对应的车位停下来,出去的时候原创 2021-11-25 22:29:36 · 709 阅读 · 0 评论 -
JUC学习 - LockSupport工具类
一、JUC中的LockSupport工具类LockSupport位于java.util.concurrent(简称juc)包中,算是juc中一个基础类,juc中很多地方都会使用LockSupport,非常重要!!!关于线程等待/唤醒的方法,前面的我们已经讲过2种了:方式1:使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程方式2:使用juc包中Condition的await()方法让线程等待,使用signal()方法唤醒线程Object和Condit原创 2021-11-25 21:21:25 · 517 阅读 · 0 评论 -
JUC学习 - Condition
一、JUC中的Condition1、synchronized中等待和唤醒线程示例public class SyncWaitAndNotifyTest { static Object lock = new Object(); public static class T1 extends Thread { @Override public void run() { System.out.println(System.curre原创 2021-11-25 21:12:56 · 214 阅读 · 0 评论 -
JUC学习 - ReentrantLock
一、JUC中ReentrantLock1、synchronized的局限性synchronized是java内置的关键字,它提供了一种独占的加锁方式。synchronized的获取和释放锁由jvm实现,用户不需要显示的释放锁,非常方便,然而synchronized也有一定的局限性,例如:当线程尝试获取锁的时候,如果获取不到锁会一直阻塞,这个阻塞的过程,用户无法控制如果获取锁的线程进入休眠或者阻塞,除非当前线程异常,否则其他线程尝试获取锁必须一直等待JDK1.5之后发布,加入了Doug Lea实原创 2021-11-25 21:02:49 · 517 阅读 · 0 评论 -
JUC学习 - 中断线程的几种方式
一、中断线程的几种方式1、通过一个变量控制线程中断public class ThreadInterruptedDemo { public volatile static boolean exit = false; public static class T extends Thread { @Override public void run() { while (true) { //循环处理原创 2021-11-25 20:47:26 · 182 阅读 · 0 评论 -
JUC学习 - 线程安全和synchronized
一、线程安全和synchronized1、什么是线程安全?当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的。看一段代码:public class ThreadSafeDemo { static int num = 0; public static void m1() { for (int i = 0; i < 10000; i++) { num++;原创 2021-11-25 20:31:35 · 148 阅读 · 0 评论 -
JUC学习 - 用户线程和守护线程
一、用户线程和守护线程1、守护线程 & 用户线程的认识守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程都是守护线程。与之对应的是用户线程,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作。如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以当系统只剩下守护进程的时候,java虚拟机会自动退出。java线程分为用户线程和守护线程,线程的daemon属性为true表示是守护线程,false表示是原创 2021-11-25 20:07:59 · 166 阅读 · 0 评论 -
JUC学习 - 线程组 ThreadGroup
一、线程组我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树形结构,如下图:使用线程组可以方便管理线程,线程组提供了一些方法方便方便我们管理线程。1、创建线程关联线程组创建线程的时候,可以给线程指定一个线程组,代码如下:public class ThreadGroupDemo { public static class R1 implements Runnable { public void原创 2021-11-25 19:53:45 · 164 阅读 · 0 评论 -
JUC学习 - volatile与Java内存模型
一、volatile与Java内存模型在开始前先让我们看一个简单的例子:public class ThreadDemo { public static boolean flag = true; public static class T1 extends Thread { public T1(String name) { super(name); } @Override public voi原创 2021-11-25 19:41:38 · 189 阅读 · 0 评论 -
JUC学习 - 线程的基本操作
一、新建线程新建线程很简单。只需要使用new关键字创建一个线程对象,然后调用它的start()启动线程即可。Thread thread1 = new Thread();thread1.start();那么线程start()之后,会干什么呢?线程有个run()方法,start()会创建一个新的线程并让这个线程执行run()方法。这里需要注意,下面代码也能通过编译,也能正常执行。但是,却不能新建一个线程,而是在当前线程中调用run()方法,将run方法只是作为一个普通的方法调用。Thread th原创 2021-11-25 19:35:09 · 233 阅读 · 0 评论 -
JUC学习 - 基础概念的认识
一、同步(Synchronous)和异步(Asynchronous)同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。整个过程,不会阻碍调用者的工作。如图:上图中显示了同步方法调用和异步方法调用的区别。对于调用者来说,异步调用似乎是一瞬间就完成的。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通原创 2021-11-24 20:49:36 · 326 阅读 · 0 评论 -
JUC学习 - 并行的两个重要概念
一、并行的介绍有关为什么要使用并行程序的问题前面在这就不进行探讨了。总的来说,最重要的应该是处于两个目的。第一,为了获得更好的性能;第二,由于业务模型的需要,确实需要多个执行实体。在这里,我将更加关注第一种情况,也就是有关性能的问题。将串行程序改造为并发程序,一般来说可以提高程序的整体性能,但是究竟能提高多少,甚至说究竟是否真的可以提高,还是一个需要研究的问题。目前,主要有两个定律对这个问题进行解答,一个是Amdahl定律,另外一个是Gustafson定律。二、Amdahl(阿姆达尔)定律A原创 2021-11-24 19:22:09 · 335 阅读 · 0 评论 -
JUC 学习 - JMM
一、JMM 概述什么是 JMM?内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象描述,不同架构下的物理机拥有不一样的内存模型,Java虚拟机是一个实现了跨平台的虚拟系统,因此它也有自己的内存模型,即Java内存模型(Java Memory Model, JMM)。因此它不是对物理内存的规范,而是在虚拟机基础上进行的规范从而实现平台一致性,以达到Java程序能够“一次编写,到处运行”。那么究竟什么是内存模型?内存模型描述了程序中各个变量(实例域、静态原创 2021-11-24 19:13:04 · 285 阅读 · 0 评论