草庐IT

JUC并发编程学习笔记(十)线程池(重点)

线程池(重点)线程池:三大方法、七大参数、四种拒绝策略池化技术程序的运行,本质:占用系统的资源!优化资源的使用!->池化技术(线程池、连接池、对象池......);创建和销毁十分消耗资源池化技术:事先准备好一些资源,有人要用就拿,拿完用完还给我。线程池的好处:1、降低资源消耗2、提高相应速度3、方便管理线程复用、可以控制最大并发数、管理线程线程池:三大方法1、newSingleThreadExecutor单列线程池,只有一条线程;单例线程池配合callable使用,注意需要在程序运行结束后关闭线程池packageorg.example.pool;importjava.util.concurre

JUC并发编程学习笔记(七)常用的辅助类

常用的辅助类CountDownLatch这是一个JUC计数器辅助类,计数器有加有减,这是减。使用方法packageorg.example.demo;importjava.util.concurrent.CountDownLatch;//线程计数器publicclassCountDownLatchDemo{publicstaticvoidmain(String[]args){CountDownLatchcountDownLatch=newCountDownLatch(6);//总数为6,必须要执行任务时用for(inti=0;i{System.out.println(Thread.current

JUC并发编程学习(五)集合类不安全

集合类不安全List不安全单线程情况下集合类和很多其他的类都是安全的,因为同一时间只有一个线程在对他们进行修改,但是如果是多线程情况下,那么集合类就不一定是安全的,可能会出现一条线程正在修改的同时另一条线程启动来对这个集合进行修改,这种情况下就会导致发生并发修改异常(在jdk11的环境下多次测试该代码发现并无问题,但是学习教程中有该异常。原因:线程数量不够)packageorg.example.unsafe;importjava.util.ArrayList;importjava.util.UUID;publicclassTest1{publicstaticvoidmain(String[]a

JUC并发编程学习笔记(六)Callable(简单)

Callable(简单)callable接口和runnable接口类似,都是为了执行另外一条线程而设计的,区别是Runnable不会返回结果也不会抛出异常。1、可以有返回值2、可以抛出异常3、方法不同;run()/call();Runnable实现Runnable接口,重写run方法,无返回值//原线程classRunnableThreadimplementsRunnable{@Overridepublicvoidrun(){}}Callable实现Callable接口,重写call方法,有返回值,可在实现接口时设定//callable线程classCallableThreadimplemen

JUC并发编程学习笔记(三)生产者和消费者问题

生产者和消费者问题synchronized版->wait/notifyjuc版->Lock面试:单例模式、排序算法、生产者和消费者、死锁生产者和消费者问题Synchronized版packageorg.example.pc;publicclassA{publicstaticvoidmain(String[]args){Datedate=newDate();newThread(()->{for(inti=0;i{for(inti=0;i"+number);//通知其他线程,我完成了this.notify();}publicsynchronizedvoiddecrement(){if(number

JUC并发编程学习笔记(一)认知进程和线程

进程和线程进程一个程序,如QQ.exe,是程序的集合一个进程往往可以包含多个线程,至少包含一个java默认有两个线程,GC垃圾回收线程和Main线程线程:一个进程中的各个功能java无法真正的开启线程,因为java是运行在虚拟机上的,所以只能通过C++,通过native本地方法调用C++开启线程privatenativevoidstart0();并发、并行并发:多线程操作同一资源cpu单核情况下,通过快速交替模拟多条线程并行:多个线程一起行走只有在cpu多核情况下才可能产生并行,多个线程同时进行,cpu核数决定最大并行量。线程池并发编程的本质就是想要充分利用电脑的cpu资源线程有几个状态jav

JUC并发编程学习笔记(二)Lock锁(重点)

Lock锁(重点)传统的synchronized传统的解决多线程并发导致的一些问题我们会使用synchronized关键字来解决,synchronized的本质就是队列、锁。Lock的实现类有:可重复锁(最常用)、读锁、写锁在创建可重复锁时,可传入boolean类型值来决定该锁是公平锁(先来后到)还是非公平锁(可插队)。三部曲1、创建一个锁Locklock=newReentrantLock(true);2、加锁lock.lock();3、将业务代码块包裹在try{}cath(){}finally{lock.unlock();}中try{if(number>0){System.out.print

JUC并发编程学习笔记(四)8锁现象

8锁现象八锁->就是关于锁的八个问题锁是什么,如何判断锁的是谁对象、class模板深刻理解锁锁的东西无外乎就两样:1、同步方法的调用者,2、Class模板。同一个锁中,只有当前线程资源释放后才会被下一个线程所接手。同步方法的调用者是两个不同的实例时,互不相关。静态同步方法(static)锁的是整个Class模板,和同步方法的调用者也不是同一个锁;切Class模板在Java程序中唯一。代码示例1、浅浅理解锁的作用同一把锁中根据执行先后释放资源,保证一个资源的使用顺序packageorg.example.phone;importjava.util.concurrent.TimeUnit;publi

JUC前置知识

JUC前置知识JUC概述在开发语言中,线程部分是重点,JUC是关于线程的。JUC是java.util.concurrent工具包的简称。这是一个处理线程的工具包,JDK1.5开始出现的。线程和进程线程和进程的概念进程(process):是计算机的程序关于某数据集合上的一次允许活动,是操作系统进行资源分配和任务调度的最小单位,是操作系统的基础。在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令,数据及其组织形式的描述,进程是程序的实体。线程(thread):是操作系统或CPU核心能够进行调度的最小单位。被包含在进程中,是进程中的实际运行单位。一条线程指的是进程中一个单一顺序的控制流,

Java并发编程面试题——JUC专题

文章目录一、AQS高频问题1.1AQS是什么?1.2唤醒线程时,AQS为什么从后往前遍历?1.3AQS为什么用双向链表,(为啥不用单向链表)?1.4AQS为什么要有一个虚拟的head节点1.5ReentrantLock的底层实现原理1.6ReentrantLock的公平锁和非公平锁的区别1.7ReentrantReadWriteLock如何实现的读写锁二、阻塞队列高频问题2.1说下你熟悉的阻塞队列?2.2虚假唤醒是什么?三、线程池高频问题3.1线程池的7个参数3.2线程池的状态有什么,如何记录的?3.3线程池常见的拒绝策略3.4线程池执行流程3.5线程池为什么添加空任务的非核心线程3.7工作线