自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 Spring Framework5.3.10——Bean生命周期

Bean的生命周期流程Bean的生成过程1. 生成BeanDefinitionSpring启动的时候会进行扫描,会先调用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#findCandidateComponents(String basePackage) 扫描某个包路径,并得到BeanDefinition的Set集合Spring扫描底层流程:https://www.process

2021-09-23 00:42:46 300

原创 一、Redis的单线程和高性能

Redis的单线程和高性能

2022-08-23 23:22:02 310 1

原创 CentOS-2022.1.6

一、关闭防火墙1、命令行界面输入命令“systemctl status firewalld.service”并按下回车键。2、然后在下方可度以查看得到“active(running)”,此时说明防火墙已经被打开了。3、在命令行中输入systemctl stop firewalld.service命令,进行关闭防火墙。4、然后再使用命令systemctl status firewalld.service,在下方出现disavtive(dead),这权样就说明防火墙已经关闭。5、再在命令行中输入命令“

2022-01-06 15:33:05 713

原创 Java并发编程——锁(公平锁,非公平锁、可重入锁、自旋锁、死锁)

一、公平锁,非公平锁公平锁: 非常公平, 不能够插队,必须先来后到!非公平锁:非常不公平,可以插队 (默认都是非公平)public ReentrantLock() { sync = new NonfairSync();}public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync();}二、可重入锁可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁Synchroni

2021-08-19 00:57:37 132

原创 Java并发编程——CAS

什么是CAS?compare and swap,比较并交换。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。//CAS:compareAndSwap:比较并交换public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger=n

2021-08-18 22:25:11 112

原创 Java并发编程——单例模式+单例模式不安全

一、饿汉式单例描述:这种方式比较常用,但容易产生垃圾对象。优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存。它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。//饿汉式单例public class H

2021-08-18 21:49:48 403

原创 Java并发编程——内存模型(JMM)+volatile

JMM:Java内存模型。JMM规定了内存主要划分为主内存和工作内存两种。主内存对应的是Java堆中的对象实例部分,工作内存对应的是栈中的部分区域。每条线程拥有各自的工作内存,工作内存中的变量是主内存中的一份拷贝。关于JMM的一些同步的约定1.线程解锁前,必须把共享变量立刻刷回主存。2.线程加锁前,必须读取主存中的最新值到工作内存中3.加锁和解锁是同一把锁8种操作1、lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。2、unlock(解锁):作用于主内存的变量,它

2021-08-18 14:43:18 120

原创 Java并发编程——分支合并(ForkJoin)

ForkJoin并行执行任务!提高效率!大数据量!任务的分割与合并主流程ForkJoin特点:工作窃取这里面维护的都是双端队列测试代码://求和计算的任务/* * 如何使用forkjoin * 1.forkjoinPool通过它来执行 * 2.计算任务 forkjoinPool.execute(ForkJoinTask task) * 3.计算类要继承ForkJoinTask */public class ForkJoinDemo extends RecursiveTask&l

2021-08-18 00:46:08 237

原创 Java并发编程——Stream流式计算

java8的流式处理极大的简化了对于集合的操作,实际上不光是集合,包括数组、文件等,只要是可以转换成流,我们都可以借助流式处理,类似于我们写SQL语句一样对其进行操作。java8通过内部迭代来实现对流的处理,一个流式处理可以分为三个部分:转换成流、中间操作、终端操作。如下图:代码举例:public class Test { /* * 现在有5个用户!筛选,一行代码实现 * 1.ID必须是偶数 * 2.年龄必须大于23岁 * 3.用户名转为大写字母

2021-08-17 23:26:38 483

原创 Java并发编程——四大函数式接口

函数式接口:只有一个方法的接口如:Runnable、foreach等一、Function:函数式接口传入参数T,返回类型R//Function 函数式接口,有一个输入参数,有一个输出参数//只要是函数式接口就可以用lambda表达式简化public class Demo01 { public static void main(String[] args) { //工具类:输出输入的值 /*Function function =new Function&l

2021-08-17 22:52:13 296

原创 Java并发编程——线程池

一、池化技术程序运行的本质是占用系统资源,而池化技术可以优化资源的使用。池化技术:事先准备好一些资源,有人要用,就来拿,用还之后还给线程池(生活类似场景:共享充电宝)线程池的好处:1.降低资源的消耗2.提高响应的速度3.方便管理(线程复用、控制最大并发数、管理线程)二、线程池(三大方法)1.newSingleThreadExecutor()newSingleThreadExecutor()方法创建一次执行单个任务的执行程序。//Executorspublic class Demo01

2021-08-17 22:05:17 120

原创 Java并发编程——同步队列(SynchronousQueue)

SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加;可以认为SynchronousQueue是一个缓存值为1的阻塞队列。public class SynchronousQueueDemo { public static void main(String[] args) { BlockingQueue<String> blockingQueue=new Synchronous

2021-08-17 20:44:21 721

原创 Java并发编程——阻塞队列(BlockingQueue)

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。以下所有测试使用的队列长度为3一、抛出异常1.添加:add()使用add()方法向队列中添加元素,若多添加,会报java.lang.IllegalStateExcep

2021-08-17 19:00:20 494

原创 Java并发编程——读写锁(ReadWriteLock)

一、ReadWriteLock介绍来自JDK1.8 api文档ReadWriteLock maintains a pair of associated locks, one for read-only operations and one for writing. The read lock may be held simultaneously by multiple reader threads, so long as there are no writers. The write lock is e

2021-08-16 14:48:15 165

原创 Java并发编程——常用的辅助类(CountDownLatch、CyclicBarrier、Semaphore)

一、CountDownLatchCountDownLatch:允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。//计数器public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { //总数是6,必须要执行任务的时候再使用 CountDownLatch countDownLatch = new Cou

2021-08-16 00:31:20 171

原创 Java并发编程——并发下HashMap不安全问题(ConcurrentHashMap)

问题再现:并发下对Map进行add和遍历输出,出现java.util.ConcurrentModificationException异常public class MapTest { public static void main(String[] args) { Map<String,String> map=new HashMap<>(); for (int i = 0; i < 30; i++) { new T

2021-08-15 23:30:44 477

原创 Java并发编程——并发下HashSet不安全问题(CopyOnWriteSet)

问题再现:并发下对Set进行add和遍历输出,出现java.util.ConcurrentModificationException异常public class SetTest { public static void main(String[] args) { Set<String> set = new HashSet<String>(); for (int i = 0; i < 30; i++) { new

2021-08-15 22:48:32 852

原创 Java并发编程——并发下ArrayList不安全问题(CopyOnWriteArrayList)

问题再现:并发下1对ArrayList进行add和遍历输出,出现java.util.ConcurrentModificationException异常public class ListTest { public static void main(String[] args) { List<String> list = new ArrayList<String>(); for (int i = 0; i < 10; i++) {

2021-08-15 22:23:24 282

原创 Java并发编程——八门金锁(8锁现象)

现象一public class Test1 { public static void main(String[] args) { Phone phone=new Phone(); new Thread(()->{ phone.sendSms(); },"A").start(); try { TimeUnit.SECONDS.sleep(1); } catch (I

2021-08-15 19:00:08 188

原创 Java并发编程——wait()虚假唤醒

在生产者和消费者问题中,使用wait()方法可能造成的虚假唤醒和解决方法问题代码:public class A { public static void main(String[] args) { Data data = new Data(); new Thread(()->{ for (int i = 0; i < 10; i++) { try { dat

2021-08-15 17:08:46 266

原创 Java并发编程——(9)线程池

十六、线程池1.线程池概述(1)背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。(2)思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。(3)优点:1.提高响应速度(减少了创建新线程的时间);2.降低资源消耗((重复利用线程池中线程,不需要每次都创建);3.便于线程管理。corePoolSize:核心池的大小maximumPoolSize:最大线程数keepAliveTim

2021-08-14 14:14:14 63

原创 Java并发编程——(8)线程协作(生产者消费者问题)

14、Lock(锁)1.从JDK5开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当;2.java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock加锁,线程开始访问共享资源之前应先获得Lock对象;3.ReentrantLock实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是Reen

2021-08-14 13:45:15 119

原创 Java并发编程——(7)死锁+Lock(锁)

十三、死锁多个线程各自占有一定资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对象释放资源,都停止执行的情形。某个同步块同时拥有"两个以上对象的锁"时,就可能发生"死锁"的问题。1.死锁举例下面是死锁的情况://死锁:多个线程互相抱着对需要的资源,然后形成僵持public class DeadLock { public static void main(String[] args) { Makeup g1=new Makeup(0, "灰姑娘"); Make

2021-08-14 00:15:00 123

原创 Java并发编程——(6)同步方法和同步块+CopyOnWriteArrayList

十一、同步方法和同步块1.同步方法(1)由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提出一套机制,这套机制就是synchronized关键字,他包括两种用法:synchronized方法和synchronized块同步方法:public synchronized void method(int args){}(2)synchronized方法控制对"对象"的访问,每个对象对应一把锁,每个synchronized方法都必须获得调用方法的对象的锁才能执行,否

2021-08-13 22:49:37 60

原创 Java并发编程——(5)守护线程+线程同步

九、守护线程1.线程分为守护线程和用户线程2.虚拟机必须确保用户线程执行完毕3.虚拟机不用等待守护线程执行完毕4.守护线程如:操作日志,监控内存,垃圾回收等//守护线程public class TestDaemon { public static void main(String[] args) { God god = new God(); He he = new He(); Thread thread = new Thread(god); thread.setDaemon(t

2021-08-13 22:05:17 69

原创 Java并发编程——(4)观测线程状态+线程优先级

七、观测线程状态//观察测试线程的状态public class TestState { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (InterruptedExcep

2021-08-13 19:10:18 97

原创 Java并发编程——(3)线程状态+线程方法(stop、sleep、yield、join)

五、线程状态1.线程状态图(1)新建(new):新创建了一个线程对象。(2)就绪(可运行状态)(runnable):线程对象创建后,当调用线程对象的 start()方法,该线程处于就绪状态,等待被线程调度选中,获取cpu的使用权。(3)运行(running):可运行状态(runnable)的线程获得了cpu时间(timeslice),执行程序代码。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;(4)阻塞(block):处于运行状态中的线程由

2021-08-13 15:32:26 161

原创 Java并发编程——(2)静态代理模式+Lambda表达式

三、静态代理模式Thread类实际上也是实现了Runnable接口,本质都是实现了Runnable接口中run方法的重写。Runnable接口使用了静态代理模式我们在使用Runnable接口实现多线程的时候启动必须借助Thread类对象,我们将这个Thread对象称之为代理对象,这个代理实际上是静态代理(装饰模式)下面以Marry的例子说明静态代理模式/* * 静态代理模式 * 真实对象和代理对象都要实现同一个接口 * 代理对象要代理真实角色 * 优点: * 代理对象可以做很多真实对象做不

2021-08-13 01:14:42 120

原创 Java并发编程——(1)线程简介+线程创建(Thread、Runnable、Callable)

一、线程简介1.程序、进程、线程在操作系统中运行的程序就是进程(Process),比如:QQ、腾讯视频、网易云音乐等。进程是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。一个进程可以有多个线程(Thread),比如:视频可以听声音,看弹幕,看图像等。通常在一个进程中可以包含若干个线程,一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位。二、线程创建(Thread、Runnable、Callable)1.创建方式1.Thread class:继承Thr

2021-08-12 23:51:09 63

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除