- 博客(61)
- 收藏
- 关注
原创 java内存模型(JMM)
1、并发编程的两大问题:多线程之间如何通信以及多线程之间如何同步2、线程之间的通信机制包含:共享内存和消息传递3、保证现成的安全是在承接上次线程写完之后再读4、(面试点)java线程的通信方式:①、volatile 读锁,轻锁,修饰变量的。写后读,只保证读一定是正确的,但是不保证写。应用场景:volatile只读变量是正确的,多线程下的i++,操作是会发生错误的②等待/通知机制wait()和notify()机制③、join()要想让主线程在线程之后执行,要使用join
2022-05-16 17:10:34
309
原创 消息队列解耦合
队列:传统的串行化服务的缺点是1、耦合性太强,(如果发生网络波荡,就会导致都失败)2系统吞吐量不大,耗时多传统的串行化服务的优点是:系统结构简单,排查错误比较方便。消息队列消息只需要发送到消息队列上,成功就会返回成功,不用考虑后面的操作,之后的操作都是异步的操作优点:解耦,提高性能缺点:分布式事务解决方案以一个淘宝订单的简单系统流程来展示,两者的区别:事务:只要涉及到消息队列,肯定是要处理事务问题,事务:具有原子性,所有的动作要么都执行,要么都不执行
2022-05-16 14:23:46
765
原创 多线程并发编程中的锁
1、volatile,修饰的a在1线程执行完后,写回内存刷新了,此时缓存行中的线程2所用的a就被标记为无效了,要再次从内存读取,线程1刷新以后的a。但是他只能保证当前查看的时候是正确的,但是最后的结果是不保证的总线是传送地址和数据,要先传地址再传数据,这时就将缓存行中的地址也发送出去,而另外的地址就标记为无效2、缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据,也就是避免同时两个刷新回写到内存。volatile保证最先刷新回内存的是有效的。之后的是无效的3、线程执行方法相.
2022-05-16 10:21:04
458
原创 多线程并发笔记整理
1、线程本质就是栈结构2、进程从规模上要大于线程,进程是包含线程的,主方法就是主线程3、线程在创立以后,各自之间的执行是互不干扰的4、创建线程之后,如果没有start(),线程是无法启动的,但是线程调用start()只是让线程进入就绪状态,需要等待一小段时间才可以被分配处理器5、分时操作系统:单核cup在一个时间段内就只能执行一个操作,在执行之前要获得时间片6、操作系统在切换执行线程的过程中是有时间开销的,线程切换消耗将近达到1ms。线程的切换也叫做上下文切换7、主线程属于当前执行的
2022-05-15 21:19:09
144
原创 产生死锁和避免死锁
如何造成死锁:在下面的代码中,线程t1对A进行加锁,线程t2对B进行加锁,但是t1想要B,t2想要A,这样就会导致,两个线程都在等待对方释放锁,从而造成死锁。如何避免死锁:1、避免一个线程同时获取多个锁。2、避免一次线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源3、尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制。4、对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况...
2022-05-15 20:41:19
552
原创 如何实现多线程减少上下文切换
多线程处理,虽然减少了CPU的浪费,但是,线程间的切换会导致开销增大,如何减少线程的切换1、无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,采用一些方法来避免使用 锁,如将数据的ID按照Hash算法来取模分段,不同的线程处理不同的段2、CAS算法:Java的Atomic包使用CAS算法更新数据,所以不需要加锁3、使用最少线程:避免创建不需要的线程,比如任务很少,但是创建很多线程,这样会导致大量线程处于等待状态。4、协程:在单线程里实现多任务的调度,并在单
2022-05-15 19:58:38
383
原创 SpringMVC的响应,SpringMVC上传文件
数据处理和跳转:在前面的博客中,我们介绍到SpringMVC的架构是通过前端控制器dispatchservlet将前端传递的请求发送到处理器映射器,处理器映射器再将请求返回前端控制器,然后让由前端控制器发送到处理器适配器,而处理器就是Controller层的方法,经过处理器将请求处理后,按照ModelAndView格式返回,再由视图解析器渲染到浏览器上。下面详细介绍一下数据处理和跳转的过程:1、结果跳转方式(1)ModelAndView配置视图解析器跳转到前端页面,设置ModelAndV
2022-05-14 21:40:32
315
原创 基数排序的代码
基数排序就是在桶排序的基础上进行的,先比较每个元素的个位,在比较十位。。一次往上。一共设置0~9 10个桶,将符合位数的元素放到相应桶中,然后每次比较完一位后,在将整个数组重新复制给原来的数组。代码如下:public static void main(String[] args){ int[] arr={ 321, 1234, 543, 324, 24, 960, 540, 672, 783, 1000 }; RadixSort(arr);
2022-05-14 17:05:01
215
原创 希尔排序代码和原理
希尔排序是根据步长比较并交换数组元素,每一次排序,步长都会发生变化,并且是按照折半的方式进行变化,随着前期排序的进行,越往后的排序,需要变动的元素就越少。代码如下://希尔排序public static void ShellSort(int[] arr) { for (int gap = arr.length / 2; gap > 0; gap /= 2) {//初始以数组的一半作为步长,之后就是根据步长,把数组分为几个组,每个组内调用直接插入排序 for (.
2022-05-14 16:57:44
394
原创 直接插入排序代码和原理
直接插入排序的原理是将数组分成,已排好序的和待排序的两个数组。通过比较排好序的最后一个元素和待排序的第一个元素,判断是否要进行交换设置 i 的初始值为1,而不是从0开始。j 的初始值为i-1每一轮 j 都要遍历到最前端,并且比较arr[j]和arr[j+1]代码如下:public static void InsertSort(int[] arr){ for (int i=1;i<arr.length;i++){//首先确定第一个数为排好序的数组 f
2022-05-14 16:47:13
524
原创 简单原则排序代码原理
简单选择排序,就是选择一个值作为最小值,然后通过不断地进行比较交换,将数组进行排序的过程。需要设置一个最小值变量min和一个最小值下标变量minIndex两个指针,指针在遍历过程中,如果遇到比min小的元素,就将元素值给min,元素下标赋值给minIndex交换下标为i和j的值,并且还要再把初始位置的值赋给min无论每一次遍历是否进行交换,都需要在一次更新min中的值。arr[minIndex]=arr[i];arr[i]=min;代码如下:public st...
2022-05-14 16:38:03
289
原创 冒泡排序原理和代码
冒泡排序是八大排序中,最简单的一个排序,但是同时,也是时间复杂度最高的排序算法,他的时间复杂度为O(n^2)他的原理也很简单,就是使用双指针,不断地遍历数组。像冒泡一样,不停地把最大的数组元素往后面交换第一次:第二次:。。。。每一次冒泡,都可以得到一个固定位置的值是不在变化的,直到所有的元素,都排好顺序。代码实现:public static void main(String[] args) { int[] arr={2,4,6,9,5,1,8};
2022-05-14 16:19:37
136
原创 堆排序原理及java代码实现
堆排序的实现原理是将,数组元素,看做是位于一棵二叉树上的节点。通过构建大根堆,需要使用父子指针,设置,左孩子和右孩子指针。设置初始的父亲指针指向二叉树的最后一个元素,左孩子指针的下标应该为2*parent+1,右孩子指针下标 child+1完成构建大根堆交换堆顶堆底元素,并做减枝操作,并重复这个动作,直到长度为1代码如下: public static void main(String[] args) { int[] num={5,7,4,2,0.
2022-05-14 16:05:46
151
原创 MySQL实现数据字段内容截取
在数据库中,我们想要实现字符串截取,可以通过使用substring_index函数来实现str='王小明,男,1002'如果我们想要拿到1002这个数据可以使用subString_index(str,',',-1) 如果想要截取王小明subString_index(str,',',1) 但是如果想要获取男,我们却不可以用subString_index(str,',',2) 因为上述代码,获取的是(王小明,男)这两个内容,所以,只能嵌套使用subString
2022-05-13 21:39:07
2338
原创 MySQL日期查询使用的方法函数
在表中date是日期字段以2021-8-13为例如果想要获取字段中的年月日year(date)-----获取年--2021month(date)---获取月--8day(date)---- 获取日---13如果想要获取两个日期之间的天数DATEDIFF(date1,date2)--(date1-date2)返回的是天数需要注意的是,date1和date2 都要是合法日期获取日期表达式在原有的日期的基础上增加日期时间DATE_ADD(date,INT.
2022-05-13 21:25:10
534
原创 SpringMVC配置
一、项目配置:1、首先我们,新建一个maven项目,同时勾选Create from archetype,我们新建一个2、自定义项目名,然后Next3、我们此时要提前下载一个maven包,然后设置我们的settings路径为我们下载maven包的settings,然后finish4、然后就可以看到我们经常见到的项目页面了。此时我们需要,配置项目的配置文件也就是,进去后,就会弹出的pom.xml文件,然后,我们删除原配置文件里面的一些内容,最后的结果为5、导入我...
2022-04-21 20:58:57
7947
原创 SpringAOP
AOP的引例:在以往我们在做Servlet项目的时候,当我们设计好了项目,但是有想往代码中添加新的功能,我们能做的就是,修改源代码。但是有没有什么好的方法来解决修改源码的问题呢?我们设计一个登录程序:现在我想增加一个新的权限判断功能AOP相关的概念1、AOP的概述AOP为Aspect Oriented Programmaing 的缩写,意味:面向切面编程AOP是一种编程范式,隶属于软工范畴,指导开发者如何指针程序结构AOP最早由AOP联盟组织提出们制定了一套规范,Sp
2022-04-19 23:46:35
298
原创 Spring框架的Bean管理
1、首先Bean管理是指,以下两个操作(1)创建对象(2)注入属性2、Bean管理操作的两种方式(1)基于xlm配置文件的实现方式(2)基于注解的实现方式3、基于xml配置文件的方式实现Bean管理和注入属性1、基于xml方式创建对象<bean id="demo" class="com.qcby.service.Demo" />2、基于xml方式注入属性依赖注入的概述 IOC和DI的概念 IOC:Inverse of Control,控制反转,将对
2022-04-19 22:14:24
237
原创 Spring IOC容器
Spring的IOC 就是 控制权反转,将创建对象的权力交给Spring框架。在之前的一个博客mybatis中Mybatis的关联映射_三思守心的博客-CSDN博客,一个teacher表一个student表,当我们想要在查找学生的老师的时候,我们就要在学生的实体类中定义Teacher类的对象,但是当我们查询老师的学生的时候,就需要注释掉学生的实体类的Teacher,然后在Teacher类中定义student对象,这样很麻烦,但是如果不这样,就会导致学生调用老师,老师调用学生,导致出现错误。这就引
2022-04-19 20:22:35
382
原创 Spring框架简单介绍
1、Spring框架的概述:Spring是一个开源代码的设计层面框架,解决的是业务逻辑和其他各层次的松耦合问题,主要的思想是面向接口编程。Spring的核心是控制权反转(IOC)和面向切面(AOP),Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架IOC:控制权反转,将创建对象的过程交给Spring进行管理AOP:面向切面,在不修改源代码的情况下进行代码功能的增强2、Spring的优点方便解耦,简化开发,Spring是一个大工厂,可以将所有对象的
2022-04-19 19:38:56
2527
原创 mybatis事务和缓存
一、什么是事务?事务的意义?1、事务:多个操作同时进行,要么同时成功,要么同时失败2、事务的四个特性:一致性、持久性、原子性、隔离性(ACID)3、Mybatis关于事务的管理Mybatis框架中的事务默认是手动提交的,也就是每次编写程序都要调用commit()方法手动提交在之前的博客中有介绍到mybatis.xml的主配置文件中我们会设置<transactionManager type="JDBC"></transactionManager> ====》
2022-04-14 23:38:17
524
原创 Mybatis的延迟加载策略
在我的上篇博客中Mybatis的关联映射_三思守心的博客-CSDN博客我用了连表查询和分步查询两种方法来实现两个表的关联映射。为什么,一种方法就可以实现的东西,我们要用两步来实现呢?原因很简单:大家可以发现如果我们把他们连在一起那么他们就是一个多表查询语句,如果不放在一起执行,那就是单独一个表的查询语句。但是这需要我们设置mybatis的延迟加载(懒加载)分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息lazyLoadingEnabled:延迟加载的全局开关,当开启所
2022-04-14 22:44:38
419
原创 Mybatis的关联映射
通过mybatis实现表的关联映射,通过一下几步一、使用ddl和dml语言创建MySQL中的学生表和老师表1、学生表SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for student-- ----------------------------DROP TABLE IF EXISTS `student`;CREATE TABLE `st
2022-04-14 22:24:00
335
原创 基于maven实现mybatis的简单操作(增删改查)
1、首先创建一个数据库中的表格可以通过ddl和dmlSQL语句创造create database mybatis_demo; use mybatis_demo; CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` datetime default NULL COMMENT '生日', `sex` char(1) def
2022-04-11 16:54:32
3920
原创 链表中快慢节点的使用
在链表中,如果想要拿到链表的中间值,就可以使用快慢节点的方法,双指针,一次循环,一个走一步,一个走两步,这样当快指针都到最后时慢指针正好,走到中间/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } *.
2022-04-09 15:24:56
262
原创 用java实现zookeeper的增删改查
1、首先在IDEA创建一个maven项目,并且在pom.xml里添加上 <dependencies> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.12</versi
2022-04-05 11:09:53
1634
原创 zookeeper安装
1、下载安装包weget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz方案1:wget是一个下载指令,后面可以跟下载连接去从服务器上下载东西。方案2:也可以先下载到windows上,再通过xftp传上去。2、解压tar.gz文件指令:tar -zxvf 文件名tar -xvf apache-zookeeper-3.6.3-bin.tar.gz移动:
2022-04-05 09:58:40
2570
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人