JUC系列
文章平均质量分 88
JUC是指Java Util Concurrent,是Java SE 5中引入的一个并发编程工具包,旨在为Java开发者提供更好的多线程处理方式,减少竞争条件和死锁问题,并使并发编程更加容易。
后端技术那点事
这个作者很懒,什么都没留下…
展开
-
线程8锁问题
1、线程8锁问题1.1、代码/* * * 资源类 */class Resource { public static synchronized void sendEmail() { try { TimeUnit.SECONDS.sleep(3); System.out.println("*******sendEmail"); } catch (InterruptedException e) {原创 2022-03-17 15:31:40 · 235 阅读 · 0 评论 -
JUC系列(四)
1、CAS1.1、没有CAS之前,保证线程安全的方式多线程环境不使用原子类保证线程安全(基本数据类型)public class T3{ volatile int number = 0; //读取 public int getNumber() { return number; } //写入加锁保证原子性 public synchronized void setNumber() { number++;原创 2022-04-04 23:39:51 · 569 阅读 · 1 评论 -
JUC相关知识详解
JUC和JVM相关1、JMM (java 内存模型)1.1、什么是JMM? JMM 本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式1.2、JMM关于同步的规定:线程解锁前,必须把共享变量的值刷新回主内存线程加锁前,必须读取主内存的最新值到自己的工作内存加锁解锁是同一把锁[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjPZhKaS-16177039571原创 2021-04-06 18:14:39 · 525 阅读 · 0 评论 -
JUC系列(一)
1、为什么多线程极其重要? 多线程变得极其重要的原因从软硬件两个方面来说,首先硬件方面:主要是摩尔定律失效,它是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的,其内容是当价格不变时,将每隔18个月,性能也将提升一倍(当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍,换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上,这一定律揭示了信息技术进步的速度),但是可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主原创 2022-03-28 14:33:30 · 1583 阅读 · 0 评论 -
JUC系列(二)
1、聊一聊Java“锁”1.1、乐观锁和悲观锁悲观锁:认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁。适合写操作多的场景,先加锁可以保证写操作时数据正确,显式的锁定之后再操作同步资源。乐观锁:乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据原创 2022-03-30 21:22:50 · 698 阅读 · 0 评论 -
JUC系列(三)
1、Java内存模型1.1、什么是Java内存模型JMM?JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量(包括实例字段,静态字段和构成数组对象的元素)的读写访问方式。JMM关于同步的规定:线程解锁前,必须把共享变量的值刷新回主内存线程加锁前,必须读取主内存的最新值,到自己的工作内存加锁和解锁是同一把锁JMM规范有三大特性:可见性:可见性是指当一个线程原创 2022-04-02 16:17:51 · 1603 阅读 · 0 评论 -
JUC系列(六)
1、AbstractQueuedSynchronizer之AQSAbstractQueuedSynchronizer简称为AQS,抽象的队列同步器AQS:是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,使用一个int类变量表示持有锁的状态,通过内置的FIFO队列来完成资源获取线程的排队工作,将每条要去抢占资源的线程封装成一个Node节点来实现锁的分配,通过CAS完成对State值的修改。1.1、自定义同步组件的设计思路同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象原创 2022-04-07 11:18:02 · 1421 阅读 · 0 评论 -
自定义线程池、线程池的底层原理以及线程8锁问题
1、线程池1.1、什么是线程池?线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程并不会被销毁,而是仍然在线程池中等待下一个任务1.2、为什么要使用线程池?降低资源消耗。通过重复利用己创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。使用线程池可以进行统一的分配,调优和监控。1.3、线程池的创建方式使用Executor创建线程池 newF原创 2022-03-19 18:18:29 · 367 阅读 · 0 评论 -
JUC系列(五)
1、ThreadLocal1.1、什么是ThreadLocal线程局部变量。1.2、ThreadLocal的作用以及可以为什么保证线程安全?多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,每一个线程在访问ThreadLocal实例的时候,都有自己的、独立初始原创 2022-04-05 18:18:21 · 1042 阅读 · 0 评论