- 博客(140)
- 问答 (1)
- 收藏
- 关注
原创 SimpleDateFormat在多线程下的安全问题
SimpleDateFormat类是Java开发中的一个日期时间的转化类。它可以满足绝大多数的开发场景,但是在高并发下会出现并发问题。接下来查看下文中的案例。上面代码简单来说就是创建了一个SimpleDateFormat类对象,该对象被后续会被五个线程使用,去转化日期格式并打印。我们来查看输出结果。可以看到,只输出了一次时间转化,并且该输出格式还是错误的。接下来我们来查看为什么SimpleDateFormat类是线程不安全的。
2023-11-28 16:46:04
1372
原创 MySQL的Linux安装
需要注意的是,MySQL8之后添加了密码校验器,默认的密码等级是中等,需要密码长度不低于8位,并且需要数字与字母搭配。我这里是下的CentOS的压缩包。并且用的是FinalShell连接工具,可以选择压缩包直接上传。之后就可以使用Navicat连接Linux中的MySQL了。上传完毕后,新建mysql文件夹,并解压到该文件夹中。启动后,我们需要查看默认生成的Mysql密码是什么。解压完成后,进入mysql目录,安装mysql。登录过后,我们需要对密码校验器进行修改。然后登录MySQL并修改密码。
2023-11-27 19:50:03
925
原创 共享模型之无锁
如果交换失败,说明是多线程操作。LongAdder之所以比AtomicInteger更快,是因为LongAdder可以开辟新的单元进行自增操作,大概就是AtomicInteger在while(true)中对一个value进行自增,但是LongAdder可以存在多个value进行自增,最后将多个value综合相加就是自增结果,减少了重试次数。答案是也可以修改,因此我们可以知道,主线程是无法感知其他线程对str变量的修改,只要执行compareAndSet()方法时,prev的值与当前的值相同就可以完成修改。
2023-11-26 21:48:16
1081
原创 MySQL进阶知识:存储引擎、索引
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引警是基于表的,而不是基于库的,所以存储引警也可被称为表类型。在创建表的时候我们可以指定存储引擎,如果不指定默认为INNODB引擎create table 表明{字段1, 字段类型,……}ENGINE = 引擎名;如果想查看当前数据库支持哪些存储引擎,我们可以使用语句索引是帮助MySQL高效获取数据的数据结构(有序)。
2023-11-26 21:44:57
1097
原创 共享模型之内存
从6到36部分,是synchronized部分字节码,意思是获取类对象,复制一份存储在字符常量池中加锁,获取单例对象判断是否为空,为空则创建出一个对象,复制一份地址,根据地址调用构造器(21)后对单例对象进行复制后解锁,如果不为空跳转到37处。volatile只能解决可见性问题,并不能解决指令交错的问题,因此只适用于一个线程写多个线程读的场景,比如说两个线程分别进行i++与i--,并不能保证能够正常得出结果。写屏障:在volatile修饰的变量之前包括volatile变量,对于共享变量的变动会同步到主存。
2023-11-25 21:50:35
1024
原创 MySQL的基础知识
数值类型存在如下8种TINYINT(byte)、SMALLINT(short)、MEDIUMINT、INT(int)、BIGINT(long)、FLOAT(float)、DOUBLE(double)、DECIMAL。对于性别已经确定长度的字段,我们可以采用char(1)。而MySQL的事务是自动提交的,也就是说,每执行完一条SQL语句,MySQL会立即隐式提交事务。char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
2023-11-25 20:59:50
1297
原创 LeetCode无重复字符的最长字符串的Java实现
给定一个字符串s,请你找出其中不含有重复字符的的长度。3因为无重复字符的最长子字符串是"abc",所以其长度为 3。1因为无重复字符的最长子字符串是"b",所以其长度为 1。3因为无重复字符的最长子串是"wke",所以其长度为 3。请注意,你的答案必须是的长度,"pwke"是一个子序列,不是子串。s = ""0。
2023-11-24 21:25:33
691
原创 数据结构与算法【哈希表】的Java实现
哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1)。在实现哈希表时,如果只靠数组存储,当需要存储大量元素时,系统很难在内存中找到连续的内存空间。因此需要结合链表来存储大量数据,当链表长度过高时,会转化成红黑树。其次哈希码是可以重复的,当重复时根据数据的值来进行区分。接下来以代码的形式来解释。
2023-11-24 20:42:07
1502
原创 数据结构与算法【B树】的Java实现+图解
B树的节点属性,与其他树不太相同,首先是key可以有多个,因此要设置为数组,孩子节点也未知,因此也要设置为数组。特性3:除根结点与叶子节点外,每个节点至少有ceil(m/2)个孩子,根节点不是叶子节点时,最少有两个孩子。当经过合并之后,根结点可能会存在为null的情况,此时让根节点中的 0 号孩子替代掉根节点就好。父结点 3 移动到左侧孩子节点中,右侧孩子节点中的第一个key 5 移动到父结点中,左旋结束。于是将右侧节点移除,同时将父结点的值与被移除节点的值都放在最初的左孩子节点中。
2023-11-23 21:51:46
1798
原创 并发编程:共享模型之管程
那么就存在一个问题,当线程执行完自增后,还未将结果返回,但是时间片结束后静态变量值并没有发生改变,此时去执行其他线程,那么其他线程对i值又进行一次自增操作,并将结果返回后,再次回到未执行完的线程,此时执行了两次自增,但是得到的结果为自增一次的结果。但是此时线程t2正在持有锁B,那么t1获取锁B失败,进入阻塞队列等待锁B的释放,t2此时需要获取锁A,但是锁A由t1持有,t2获取不到,因此也进入阻塞队列,导致死锁的情况发生。join与保护性暂停区别在于,join是等待线程结束,保护性暂停是等待结果返回。
2023-11-22 19:23:57
214
原创 数据结构与算法【红黑树】的Java实现+图解
红黑树也是一种自平衡的二叉搜索树,较之 AVL,插入和删除时旋转次数更少。首先介绍代码实现会用到的概念兄弟节点:具有同一个父结点的一对节点可以互称为兄弟节点叔叔节点:父结点的兄弟节点。
2023-11-22 16:35:20
1847
1
原创 Java中锁的深入理解
每次加锁时,先判断对象中的Mark Word是否是本线程ID(轻量级锁和偏向锁的锁对象Mark Word存储的信息不同,轻量级锁存储的是对象的hash值,偏向锁存储的是ThreadID)。自旋优化:当线程加锁时发现锁被占用会进入阻塞状态,但是这样会大量进行线程上下文切换,比较占用CPU,因此可以使用自旋优化,所谓自旋优化,是线程循环获取锁,失败后还是要去获取锁,如果在规定次数内还没有获取到锁,那么进入阻塞状态,因为这是一个循环过程,也是要占用CPU资源的。单核CPU没有自旋的必要。对于第二种情况进行分析。
2023-11-19 21:42:17
732
原创 数据结构与算法【二叉搜索树】Java实现
AVL树是一种自平衡树,保证了树的高度平衡,从而保证了树的查询和插入操作的时间复杂度均为O(logn)。相比于一般二叉搜索树,AVL树对查询效率的提升更为显著,因为其左右子树高度的差值不会超过1,避免了二叉搜索树退化为链表的情况,使得整棵树的高度更低。AVL树的删除操作比较简单,只需要像插入一样旋转即可,在旋转过程中树的平衡性可以得到维护。AVL树每次插入或删除节点时需要进行旋转操作,这个操作比较耗时,因此在一些应用中不太适用。
2023-11-19 21:26:53
280
原创 Java之线程的概念及方法的学习
t1线程抢占CPU时间片后,对list进行size++,加完后要要返回size值,比如说初始是0,进行size++后应该返回1但是还未进行返回,线程t2拿到CPU时间片,拿到的size值还为0,进行size++后返回1,t1恢复还是返回1但实际上size应该为2。比如说一个后台监控系统,一个线程while循环持续监控,当不需要监控时,打断线程即可,如果在休眠期期间被打断,那么抓住异常手动设置打断标记,如果是执行监控时被打断,等到下一次判断时就会退出循环。如果本身为1,则修改为0不会休眠。
2023-11-18 21:45:19
515
原创 Java设计模式之解释器模式
给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。以计算器为例,其语法规则为这里的符号“::=”表示“定义为”的意思,竖线 | 表示或,左右的其中一个,引号内为字符本身,引号外为语法expression可以取value、plus、minus三者其一。plus可以只可取expression,即上面三个都可以取。
2023-11-17 21:44:17
261
原创 数据结构与算法【栈】的Java实现
由于只有一个出口,因此我们使用单链表就可以实现,首先我们需要清楚的是先进入的后出去,也就是说,最先进入的元素应该是栈底,因此采用头插法。其次我采用带有哨兵的单链表,这里哨兵节点中的value值可以记录栈中元素数量,但为了方便,我采用了使用size来记录栈中元素数量。在数组实现的方法中,我们需要一个top指针记录最新出栈的下标位置。我这个实现中,top的值永远等于栈中的元素个数。习惯来说,这一端称之为栈顶,另一端不能操作数据的称之为栈底。简单接口,待会我们的两种实现方式都需要实现该接口。
2023-11-17 21:39:24
172
原创 数据结构与算法【队列】的Java实现
我们的实现方式中指针的值是通过+1并取余来确定指针的下一个位置,也就是说,head和tail的值始终是在数组长度中。而在Java源码中,并没有规定head与tail的取值一定是数组长度内,而是不停的+1然后通过对数组长度的取余,来确定head与tail的下标位置。如果用户指定数组队列不是一个2的n次方时,他会强制扩容到最近的2的n次方大小。在Java源码中的基于数组实现的队列对容量有一个要求,即一定是2的n次方。队列:以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。是二进制的另一个特性。
2023-11-16 18:27:57
359
原创 Java设计模式之备忘录模式
又叫快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
2023-11-15 21:47:41
371
原创 数据结构与算法【递归】Java实现
比如说需要排序的数组为[1,2,3,4,5,7,6]。那么经过排序之后,应该为[1,2,3,4,5,6,7]。之所以可以这样优化,是因为a的函数返回结果就是b的返回结果,那么a的内存可以直接释放。b的返回结果是c的返回结果,那么也可以直接释放b所占用的内存。每次调用方法时,JVM会给该方法分配一个内存空间,当递归次数过多时内存也会占用过多,当内存分配完毕,还要接着递归时,就会抛出StackOverflowError异常。上面的递归实现有一个特点就是每个递归函数只包含一个自身的调用,这称之为单路递归。
2023-11-14 20:44:25
441
原创 数据结构与算法【链表】Java实现
这种实现方法有一个弊端,那就是每次添加或是删除元素时都需要进行判断链表是否为空。因此提出了哨兵链表的概念。链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续。环形链表我们也可以引入哨兵,空链表时,哨兵既做头节点也做尾节点。所谓哨兵列表,就是头节点不存储数据,只为简化边缘判断使用。根据 index 查找,时间复杂度 O(n)每个元素知道上一个元素与下一个元素的地址。单向链表中每个元素只知道下一个节点位置。环形链表的尾节点指向的是头节点head。
2023-11-14 18:05:45
180
原创 数据结构与算法【数组】Java实现
数组是一组元素组成的数据结构,元素类型必须相同,其次,数组内元素是连续存储的,因此数组中元素地址可以通过索引计算出来。
2023-11-13 00:11:45
322
原创 数据结构与算法【二分查找】Java实现
需求:在数组 A 内,查找值target前提给定一个内含 n 个元素的有序数组 A,一个待查值 target1设置 i=0,j=n-12如果 i \gt j,结束查找,没找到3设置 m = (i+j)/2 ,m 为中间索引并向下取整4如果 target < A[m] 设置 j = m - 1,跳到第2步5如果 A[m] < target 设置 i = m + 1,跳到第2步6如果 A[m] = target,结束查找,找到了二分查找法的时间复杂度为。代码实现基础版。
2023-11-11 21:44:57
635
原创 关于Maven中pom.xml文件不报错但无法导包解决方法
我的pom文件没有报红,但是依赖无法正常导入。右下角还总出现这种问题。点开查看报错日志。大致如下通过搜索,大概可以知道是IDEA与Maven之间版本问题。
2023-11-10 21:19:54
1962
原创 RabbitMQ的高级特性
如果同时设置了消息过期时间和队列过期时间,以时间短的为准,队列过期会将所有消息移除,如果一个已经过期的消息不在队列顶端时并不会立即移除,一旦它到了队列顶端则会进行判断是否移除。我们可以通过TTL来实现一个延时队列,对消息设置过期时间存放在ttl.queue,但是没有消费者监听该队列,等到过期之后,放入死信队列,而消费者监听死信队列,对过期消息进行消费,从而实现延时队列。启动消费者,就可以看到交换机与队列被持久到磁盘中,但需要注意的时,消息并没有持久化,当重启服务器消息还是会丢失。在消费者模块添加如下代码。
2023-11-09 21:41:31
1133
原创 Leetcode刷题【hot100】盛最多水的容器
给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。你不能倾斜容器。49图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。1。
2023-11-09 15:01:26
194
原创 Leetcode刷题【hot100】移动零
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。
2023-11-08 15:10:34
215
原创 Leetcode刷题【hot100】最长连续序列
给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。4最长数字连续序列是9。
2023-11-07 17:27:42
213
原创 Leetcode刷题【hot100】字母异位词分组
给你一个字符串数组,请你将组合在一起。可以按任意顺序返回结果列表。是由重新排列源单词的所有字母得到的一个新单词。
2023-11-06 18:03:55
304
原创 Leetcode刷题【hot100】两数之和
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出target的那整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。[0,1]因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。[1,2][0,1]
2023-11-06 17:26:51
179
原创 Spring Cloud分布式缓存
Redis哨兵通常集群搭建,基于心跳检测来监控所有节点的状态,每隔一秒向集群每个节点发送ping,如果超过时间没有接收到响应,则认定为主观下线,如果Redis哨兵集群超过指定数量(建议是节点数量的一半)的节点都没有接收到响应,则认定为客观下线(真的下线了),移除下线节点,如果是主节点宕机,需要及时选举新的主节点。AOF会记录所有的写操作,但是对于同一个key,记录多次set操作是无意义的,只需要最后一次的set值就满足了,如果执行了delete操作,那么之前的set操作也无意义。offset:偏移量。
2023-11-05 21:31:50
757
原创 Java设计模式之观察者模式
又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
2023-11-04 21:01:35
761
空空如也
如何使用c语言实现一次回车输出一句话,每句话句子都不一样的。
2021-11-04
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅