自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 红黑树简介

/枚举RED,BLACK//根节点这里存在着一个问题:我们新建的结点为什么默认要为红色?答:新增的节点不能是黑色的因为 如果是黑色的 那么就需要保证每条路径上的黑色节点必须是相同的。那我们就需要无缘无故地需要新增节点,这完全是没有必要的操作,如图。

2024-01-01 21:11:31 842

原创 文件IO详解

javaIO操组详解

2024-04-27 14:40:54 846

原创 ConcurrentHashMap

在JDK1.7前,是通过加分段锁的方式来完成的线程安全的,其本质即为缩小锁的范围,降低锁冲突的概率,但其做法还是不充分,在JDK1.8后,使用每个链表的头节点作为锁对象,这样每个链表的锁对象都各不相同,且只有当两个线程针对同一个对象加锁,此时才会有竞争,才会有阻塞等待,此时便将锁的粒度变小了。:对比HashTable/HashMap扩容,是创建出一个新的更大的数组空间,将旧的元素移植到新的数组上去,这也就导致,随着扩容的次数越来越多,可能后面某次扩容操作所耗时间就非常多,影响用户体验。

2024-04-26 16:06:31 312 2

原创 CountDownLatch

CountDownLactch是一个同步工具类,用来协调线程之间的同步,其初始值是一个计数器,为线程的数量,当计时器的值为0时,代表此时所有线程的工作全部已经完成。

2024-04-24 20:07:43 324

原创 Semaphore

信号量在前面的学习中,我们使用了synchronized加锁,后面reentrantLock加锁从而实现多线程并发运行,但这两个的特点都是:在一段时间内只允许一个线程处于允许状态,其他线程都处于阻塞状态那么咱们的Semaphore就可以在某个时间指定数量个线程运行1.构造方法:指定初始资源的数量 (int permits) 是否为公平锁(boolean fair)2.acquire():获取资源 如果是无参 ,默认获取一个资源3.release():释放资源 无参,默认释放一个资源。

2024-04-24 12:45:47 168

原创 ReentrantLock

这是标准库给我们提供的另一种锁,前面我们学到的一种是顾名思义,Reentrant:可重入的 但我们也知道,synchronized锁不也是可重入的嘛?那这个锁到底有什么其他的过人之处呢?

2024-04-22 18:41:55 1214

原创 synchronized锁升级

原因就是具体问题具体分析,每一个锁状态来对应不同的情况状态,使之资源的开销最小,效率最高。1.无锁2.偏向锁3.轻量级锁4.重量级锁无锁:即线程没有加锁,为无锁状态偏向锁:只有单个线程加锁时,此时没有锁竞争轻量级锁:一个或多个线程通过CAS的方式自选竞争锁资源,临界区运行时间较短的情况重量级锁:多个线程争夺锁资源,临界区运行时间较长,此时会调用内核的锁资源,没有争抢到锁资源的线程直接放入阻塞队列,开销较大。使用maven项目,引用依赖对象头 + 实例部分 + 对齐部分。

2024-04-21 21:45:40 469

原创 Callable and FutureTask

但如果仅仅是启动线程(没有FutureTask.get()操作),那么不会报错,但会直接终止线程。由关系图可知,Callable和Runnable一样,也是一个。我们知道,当线程在休眠时被终止时,会触发sleep内部异常,在。即使触发了异常,但还是继续完成了runnable中的run方法。,故主线程被三秒,所以get()操作类似于join方法。上述代码中,我们在call方法中休眠了三秒,由于当。但在Callable中,如果线程被休眠时被唤醒,,后续的操作由程序员的代码决定。中,触发异常后并不会终止进程,

2024-04-21 15:47:09 446

原创 关于CAS

CAS:Compare And Swap,比较且交换。CAS中有三个参数:1.内存中原数据的值V 2.预期值A 3.修改后的数据BCompare:V与A会先比较是否一样Swap:如果V与A一致,那么就将B写入V返回操作是否成功。

2024-04-20 19:56:09 456

原创 多线程进阶

乐观锁:乐观锁总是抱着乐观的态度来看待线程之间锁冲突的问题(锁冲突:多个线程竞争一个锁对象,没有得到锁对象的线程就需要进行等待或者相应地处理),,只有当更新数据的时候(写操作),才会做冲突检测处理。其常见的实现方式为使用版本号或时间戳来标识数据的版本,只有当版本号都一致的时候,修改操作才生效。故乐观锁一般适用于的场景中与之相反,悲观锁总是抱着悲观的态度,。故线程在读操作或者写操作的时候,加上悲观锁后,其他线程需要等改线程释放锁后才能继续执行。

2024-04-20 15:27:30 464

原创 定时器详解

此时另一个线程调用schedule方法,且如果当线程2的任务时间小于线程1的任务时间时,此时线程2的任务就不会执行到。因为线程2的notify没作用,线程1都还没有执行到wait方法,但线程1重新执行时,此时的时间差已经是固定了的,但是这个时间差要大于线程2任务执行的时间,故线程2就会被“极端”地错过。这行代码可能会循环个非常多亿次,且别忘了,优先级队列的底层是用堆实现的,每当我们取出一个元素又出现插入时,根据堆的调整,此元素又会在堆顶,而每一层调整都是有开销的,故这一时间段的开销是重复且多余的。

2024-04-19 18:11:34 1195

原创 阻塞队列(模拟+生产者消费者)

take操作的notify操作唤醒的是put操作的wait,put操作的notify唤醒的是take操作的wait操作。wait/notify操作必须和synchroinzed成对出现。wait操作出现在当队列为空还取出队或者队列为满还入元素的时候。,直到往此队列里添加元素为止(队列不为空)2.搞清楚wait和notify的位置,队列为空,此时执行出队列操作,就会阻塞。,直到往此队列删元素(队列不为满)。

2024-04-19 11:44:40 261

原创 单例模式详解

首先,单例模式是一种设计模式,按字面意思,指一个类只能创建一个对象,当创建出多个对象的时候,就会出现报错异常单例模式为何出现?1.资源共享:某些情况下,多个对象都需要共享一个资源,例如线程池,数据库连接。使用单例模式即可创造出一个公共资源,避免重复资源的重复创造和浪费2.全局访问:一些对象需要在系统中被频繁访问,如日志,配置信息等。使用单例模式即可提供一个全局访问点,方便其他对象直接获取改实例对象3.控制实例数量:在某些情况下,系统中运行存在一个实例,如窗口管理,任务管理器等。

2024-04-17 20:52:07 1107

原创 wait和notify

作用:控制线程执行顺序。

2024-04-16 21:26:04 1149

原创 线程安全----volatile

此时如果另一个线程去修改正在读的变量时,由于读线程读的是寄存器,而变量修改只在内存上,这时候读线程就感知不到变量已经被修改了,便出现了此类问题。:当我们频繁地读取一个变量时,这时候cpu读取内存就可能会被优化称。,读的线程并不一定会读到写线程写完后的值,还是读的之前的值。保证线程读取变量的时候,都是在内存中读取,不会再产生优化。其出现的概率大多都在快速地频繁地读取一个值时。使用volatile关键字。出现这个问题的原因就在于。个线程读,一个线程写时。

2024-04-16 16:19:53 343

原创 关于死锁--

什么是不可重入锁呢?java是如何实现可重入锁的呢?如果当前持有锁的线程和将加第二次锁的线程为同一个线程,即可以正常执行,否则阻塞想象以下场景 你和你朋友在餐厅吃饭 你习惯拿筷子吃 他习惯用勺子吃这时你想试试用勺子吃是什么样子的 同时 你朋友也正好像试试用筷子吃是什么样的但是你们双方都不愿意把自己用称手的工具给对方这个时候就会产生死锁jconsole。

2024-04-15 20:47:28 362

原创 线程安全---synchronized

我们知道问题的本质即为操作非原子性,可以拆分 load/add/save,那么我们就将操作变成原子性是否就迎刃而解了 (所谓原子,就是不可再拆分的操作单位)就是线程调度中最坏的情况即为,两个线程调度正好出现 自增两次 但实际只自增1,如果每次都是这样,那么a就是50000,如果只是部分情况为这样,那么就为大于。我们知道,cpu中有一个部件名为寄存器,其访问速度更快,容量更小,cpu做运算一般都是根据寄存器上的数据,下面为a++操作的图示。进入方法就加锁,离开方法就释放锁,需要注意的是,

2024-04-15 12:30:35 553

原创 多线程意义

简略描述多线程意义

2024-04-15 08:44:54 127

原创 线程终止操作

关于static:静态区的属性存储在静态区 类中的变量存储在栈上 故static修饰的变量不会受此影响(本人猜测,如有不妥,还请更正)2.触发sleep内部的异常,程序不会终止, 且将isInterrupted()标志位变成false。,表达式内的变量都不允许发生改变,所以要在类中方法外定义。:当终止线程时,线程刚好在休眠状态,那么此时会有两个变化。意味着此线程即使报出了异常,但还是依然继续允许,将标志位重新变成false意味着什么呢?原因:使用lambda表达式时,会触发。2.线程t马上响应终止请求。

2024-04-14 20:04:07 153

原创 线程池详解

在这我们不难看出,线程池对象并不是以我们以前的方式new出来的,而是使用Executors类下的静态方法引出的,而这种方式我们称之为工厂模式,简单解释即为,使用静态方法来替代构造方法来创建对象,其优势就在于当创建很多类型不同的对象时更好地区分明了//固定池 固定了10个线程//缓存池 线程数量是动态变化的 任务多了就多几个//类似于定时器//单个线程//核心线程数//最大线程数//线程存活时间//线程存活时间单位//阻塞队列//线程工厂//拒绝策略。

2024-04-05 13:40:58 208

原创 线程和进程的区别和联系

资源分配,调度执行。

2024-03-30 16:35:26 120

原创 动态规划----按摩师问题

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。分析:通过题意,我们可以得知此问题的本质即为:在数组中,找到一组互不相邻且和最大的值,不难想到动态规划思想,将一种状态可以由另一种状态转变而来。选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。

2024-03-25 20:31:26 178

原创 二叉树刷题------最近公共祖先

通过审题,我们不难发现可以有三种情况。

2024-01-08 21:36:58 362

原创 位图简介与模拟

位图简介

2024-01-03 13:58:51 307

原创 AVL树实现

AVL树

2023-12-31 16:47:55 320

原创 关于Json对象

第一次接触JSON对象还是在:后端接收前端请求后向前端反应一个集合或者对象,由于前端所接收的类型是JSON,如果我们返回的类型是String,即可以直接返回,如果是。1.当后端响应完前端所发送的请求后,返回Json格式数据给前端后,前端会自动将JSON格式对象解析成JS对象,且拿对象里的属性。,所以无须使用ObjectMapper类的方法将其转化成JSON对象,会自动转换。方法将自定义类型转换成JSON对象格式,从而就可以返回给前端了。2.在JSON对象转Java对象时,我们可以将其细分为以下几步。

2023-12-24 23:24:46 379 1

原创 TreeMap和TreeSet

很容易可以看出,TreeMap是的,而这也导致了--TreeMap的的类型,下面是报错显示故当我们的Key是自定义类型的时候,一定要使其类对象具有比较规则,那么我们实现就有两种方法1.创建类比较器,在创建TreeMap对象的时候传入此类比较器来确定比较规则2.实现Comparable接口,重写里面的compareTo方法实现Comparable接口(按用户分数排升序)

2023-12-15 18:33:22 829

原创 浅拷贝和深拷贝

深拷贝与浅拷贝

2023-12-14 21:32:34 314 1

原创 HashMap和HashSet

前言:Map和Set都是一种用来。

2023-12-11 21:20:57 352 1

原创 Servlet----创建Maven项目

我们可以在类的上面加一个注解,类似于一个语法糖,方便程序员使用,这也是我们后面访问页面中的路径中的一个。

2023-10-27 15:00:32 30 1

原创 Java-JDBC编程-------查询操作

Query(查询操作)

2023-10-27 14:24:08 40 1

原创 Java-JDBC编程(二)--------插入自定义输入数据

主要步骤分别为:设置数据源---->连接数据库---->创建sql语句---->编译sql语句---->执行sql语句。在Java-JDBC编程(一)中我们实现了,连接数据库后,固定插入数据,本篇我们将实现自定义输入插入数据。其连接数据库步骤还是和之前的一样,不了解的小伙伴可以先去看Java-JDBC编程 基本操作。

2023-10-25 15:47:05 71 1

原创 Java JDBC编程(基本操作)

其executeUpdate()方法的返回值是数据库所受影响行数。将预编译好的sql语句发送给数据库。

2023-10-24 12:16:15 26

原创 Java-JDBC编程(一)

下载Maven仓库下的java-mysql驱动包maven仓库地址:https://cn.bing.com/search?q=maven%E4%BB%93%E5%BA%93&gs_lcrp=EgZjaHJvbWUqBggAEEUYOzIGCAAQRRg7MgYIARBFGDkyBAgCEAAyBAgDEAAyBAgEEAAyBAgFEAAyBggGEEUYPTIGCAcQRRg9MgYICBBFGD3SAQc3MzVqMGo0qAIAsAIA&FORM=ANAB01&PC=HCTS值得注意的是,大版本要和数

2023-10-24 12:05:19 32

原创 文件操作---IO详解

File类相关方法:exists():判断文件是否存在getPath():返回文件的路径getAbsolutePath:返回文件所在的绝对路径isDirectory:代表File对象所代表的是否是一个目录createNewFile():根据File对象,自动创建一个空文件,创建成功后返回truegetName():返回File类对象的纯文件名getParent:返回File类对象父级目录文件路径mkdir:创建File对象代表的目录(只能一级一级地创建)mkdirs:创建File对象代表的目录,如果必要,会

2023-10-22 14:21:06 20 1

原创 模拟实现定时器

/自定义任务类型//任务内容//任务啥时候执行 (使用毫秒时间戳来表示)//获取当前任务时间//比较方法@Override//扫描线程//优先级阻塞队列 来保存任务//因为这里使用了优先级队列, 所以泛型类必须是能够比较的,所以要确定Mytask的比较关系。

2023-10-18 14:49:07 17 1

原创 线程安全的原因及解决方法

但是,又是由于提高效率----->编译器优化,可能会出现132的顺序情况。在正常情况下,编译器都是按照123顺序执行的。如果按照132顺序来进行。

2023-09-18 17:55:09 34

原创 Java线程的几种类型

通过遍历Thread下的State枚举类型,可以知道状态一共有,分别是。

2023-09-13 15:33:33 47 1

原创 Thread类的基本用法

内核中是通过pcb来感知线程存在的,一个一个pcb我们可以简单地理解为由链表串起来的,当线程休眠时,对应的pcb会退出当时链表,1.将线程内部的属性(boolean)设置为true 2.如果此时线程处于休眠状态,那么会唤醒线程且将标志位重新赋值为false。当休眠时间到达了的时候,再 重新返回调度队列,但不会立马返回,所以如果sleep1000ms,其时间间隔是要大于1000ms。原因就存在我们的Lambda表达式(匿名类)的变量捕获当中,其。在下面的代码中,我们想要打印i时,发现报了错,这是为什么呢?

2023-09-10 09:29:48 33 1

原创 动态内存分配(malloc,calloc,realloc)

对于静态定义的数组变量,长度大小是固定的,代码灵活小很低而动态分配内存,你想要多少空间,就分配多少空间,想扩容多少空间,就扩容多少空间无论是对于代码灵活性还是自己的主观臆断性都有了很好改观。

2023-04-03 09:40:02 125

空空如也

空空如也

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

TA关注的人

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