自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 # { }和${}的区别是什么?

#{}是预编译处理,${}是字符串替换。 Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; Mybatis在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止SQL注入,提高系统安全性 ...

2021-10-08 16:16:34 126

原创 JDBC连接数据库的开发步骤和Mybatis加载的流程

JDBC: 加载数据库驱动 获取数据连接对象 获取语句对象 会话对象有两种Statement和PreparedStatement执行语句,他们区别是? PreparedStatement在执行之前会进行预编译 效率高于Statement,且能够有效防止SQL注入 PreparedStatement支持?占位符而不是直接拼接,提高可读性    处理结果集 关闭资源 rs..

2021-10-08 16:16:09 158

原创 JDK动态代理和CGLib动态代理的区别

JDK动态代理,要求目标对象实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以用CGLib动态代理 JDK动态代理是自带的,CGlib需要引入第三方包CGLib动态代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展 CGLib动态代理基于继承来实现代理,所以无法对final类、private方法和static方法实现代理Spring AOP中的代理使用的默认策略如果目标对象实现了接口,则默认采用JDK动态代理 如果目标对象没有实现接口,则采

2021-09-30 16:53:32 410

原创 什么是静态代理,SpringAOP是用什么代理

由程序创建或特定工具自动生成源代码,在程序运行前,代理类的.class文件就已经存在 通过将目标类与代理类实现同一个接口,让代理类持有真实类对象,然后在代理类方法中调用真实类方法,在调用真实类方法的前后添加我们所需要的功能扩展代码来达到增强的目的 A -> B -> CSpringAOP里面常用的是 JDK动态代理、CGLIB动态代理...

2021-09-30 16:52:29 75

原创 多线程的synchronized新版JDK里面优化点

synchronized是解决线程安全的问题,常用在 同步普通方法、静态方法、代码块 中非公平、可重入每个对象有一个锁和一个等待队列,锁只能被一个线程持有,其他需要锁的线程需要阻塞等待。锁被释放后,对象会从队列中取出一个并唤醒,唤醒哪个线程是不确定的,不保证公平性两种形式:方法:生成的字节码文件中会多一个 ACC_SYNCHRONIZED 标志位,当一个线程访问方法时,会去检查是否存在ACC_SYNCHRONIZED标识,如果存在,执行线程将先获取monitor,获取成功之后才能执行方法体,方

2021-09-29 10:14:16 137

原创 编写死锁并解决死锁

死锁代码public class DeadLockDemo { private static String locka = "locka"; private static String lockb = "lockb"; public void methodA(){ synchronized (locka){ System.out.println("我是A方法中获得了锁A "+Thread.currentThread().getN.

2021-09-28 10:07:14 89

原创 java多线程常用的锁

1. 悲观锁:当一天线程去获取锁之后,另一个线程来获取锁会阻塞等待,常见的synchronized就是悲观锁2. 乐观锁:当一天线程去操作的时候,其他的线程也可以操作,操作提交是根据版本控制的,CAS就是乐观锁,通过比较预期值与实际值的比较考虑是否提交更新。悲观锁适合写场景多的情况,乐观锁适合读场景多的情况3. 公平锁:所有线程都能公平的获取到锁,线程申请锁之后会排队到一个线程组里,根据申请顺序去获取锁的使用4. 非公平锁:不是所有线程都能拿到锁,当一个线程去请求的时候可能直接插队拿到了锁,有一

2021-09-28 10:02:10 1150

原创 常见的线程间的调度算法是怎样的,java是哪种

线程调度是指系统为线程分配CPU使用权的过程,主要分两种协同式线程调度(分时调度模式):线程执行时间由线程本身来控制,线程把自己的工作执行完之后,要主动通知系统切换到另外一个线程上。最大好处是实现简单,且切换操作对线程自己是可知的,没啥线程同步问题。坏处是线程执行时间不可控制,如果一个线程有问题,可能一直阻塞在那里抢占式线程调度:每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定(Java中,Thread.yield()可以让出执行时间,但无法获取执行时间)。线程执行时间系统可控,也不会

2021-09-27 10:59:50 107

原创 常见的进程、线程间调度算法

先来先服务调度算法: 按照作业/进程到达的先后顺序进行调度 ,即:优先考虑在系统中等待时间最长的作业 排在长进程后的短进程的等待时间长,不利于短作业/进程短作业优先调度算法: 短进程/作业(要求服务时间最短)在实际情况中占有很大比例,为了使得它们优先执行 对长作业不友好高响应比优先调度算法: 在每次调度时,先计算各个作业的优先权:优先权=响应比=(等待时间+要求服务时间)/要求服务时间, 因为等待时间与服务时间之和就是系统对该作业的响应时间,所以 优...

2021-09-27 09:16:26 271

原创 volatile核心知识点

volatile是一个轻量级的synchronized,被volatile修饰的共享变量,当线程修改之后,其他的线程可以马上看到改变,避免数据的脏读情况。volatile:保证可见性,不保证原子性synchronized:保证可见性也保证原子性脏读:java的内存模型简称JMM,JMM规定所有的变量都存在主内存,线程有自己的工作内存,所以每次线程修改值之后都会有小个时间的间隔去写入主内存,然后其他的线程会去读主内存。没有用volatile修饰的共享变量会导致线程A去修改成功之后,线程B并没有

2021-09-26 11:21:28 123

原创 不是线程安全的数据结构以及保证线程安全的方法

不是线程安全的数据结构:HashMap,ArrayList, LinkedList保证线程安全的方法:加锁,比如synchronize/ReentrantLock,使用volatile声明变量,轻量级同步,不能保证原子性,使用线程安全类(原子类AtomicXXX,并发容器,同步容器 CopyOnWriteArrayList/ConcurrentHashMap等,ThreadLocal本地私有变量/信号量Semaphore等...

2021-09-26 11:08:06 297

原创 C++单例模式的懒汉式与饿汉式区别

1、构造函数声明为private或protect防止被外部函数实例化。2、提供一个全局的静态方法(全局访问点)。3、内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。  class Usermanage { protected: singleton(){} ...

2018-08-12 14:01:57 755

原创 设计模式的基本原则

单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变...

2018-08-12 10:00:33 167

原创 static在C和C++中的区别

在C语言中static的作用如下第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。第二、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。第三、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存...

2018-08-10 10:46:08 329

原创 如何实现UDP的可靠传输

如何让UDP实现可靠传输自定义通讯协议,在应用层定义一些可靠的协议,比如检测包的顺序,重复包等问题,如果没有收到对方的ACK,重新发包UDP没有Delievery Garuantee,也没有顺序保证,所以如果你要求你的数据发送与接受既要高效,又要保证有序,收包确认等,你就需要在UDP协议上构建自己的协议。比如RTCP,RTP协议就是在UPD协议之上专门为H.323协议簇上的IP电话设计的一...

2018-08-08 15:29:36 9279

原创 TCP与UDP区别总结

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。3、UDP具有较好的实时性,工作...

2018-08-07 10:37:24 285

原创 保持进程同步的几种方法

1、信号量     用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行:初始化,P操作和V操作,这三种操作都是原子操作。     P操作(递减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于解除阻塞一个进程。      基本原理是两个或多个进程可以通过简单的信号进行合作,一个进程可以被迫在某一位置停止,直到它接收到一个特定的信号。该信号即为信号量s。     ...

2018-08-06 15:12:04 1740

原创 进程死锁

什么是进程死锁:有两个或者多个进程都在访问同一个资源的时候,都在请求对方的资源,这时候就会导致两个进程都在等待对方释放资源而导致无法正常进行下去,这就是进程死锁产生进程死锁的原因:1:资源不足以分配给多个进程使用                                     2:进程的请求和释放资源的不当 怎样预防死锁:1、采用资源静态分配策略,破坏"部分分配"条件;...

2018-08-06 14:24:47 186

原创 Linux内核之进程管理

进程:进程就是处于执行期的程序以及它包含的资源总和。线程是进程中的活动对象,每个线程拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的是线程,而不是进程。进程描述符:  内核的进程描述符为task_struct结构体,定义在<linux/sched.h>,进程描述符包含了一个进程的所有信息。包括:进程标识符、进程当前状态、栈地址空间、内存地址空间、文件系统、打...

2018-08-06 13:30:12 164

原创 编译时多态

1:什么是运算符重载:就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。2:什么是多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。3:运算符重载的规则:①、 C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。 ②、 重载之后运算符的优先级和结合性都不会改变。 ③、...

2018-03-30 23:26:22 1466

原创 学习队列的问题以及解答

1:什么是队列:队列是只允许在一段进行插入操作,而在另一端进行删除操作的线性表2:队列的特征:队列也有线性表的类似操作,不同的是在进入队列的新元素是放在队尾的3:什么是循环队列:当一个队列中的队尾元素满时但队头前面的还有空位是,就把要加进去的元素放在队头前面,这种头尾相连的就叫做循环队列4:怎么判断一个队列满员:1:设置一个变量flag,当定义的两个队头队尾指针相同开始相同时,flag

2018-02-07 15:48:45 483

原创 链表

1:链表中一个结点由什么构成:在链表中的结点由数据域和指针域构成,数据域就为存储的数据,而指针域代表存储的一个指针即为一个地址2:链表的结点有什么特点:链表中的第一个结点称为头结点,这个结点的数据域可以不存储任何东西,即为头结点可以只有一个指针指向下个结点的地址,最后一个结点的指针域为空3:链表的创建:定义一个结构体相当于结点,之后在主函数中定义一个头结点,即只有指针域没有数据域,之后定义

2018-02-07 11:20:35 205

原创 内存管理与预处理,结构体问题

1:(.bss段):直观来说即存放没有初始化或者初始化为0的全局变量,一定是全局变量。2:(.data):通俗来说(.data段)和(.bss)没有太大的区别,只是前者是存放未初始化或者初始化为0的全局变量,而后者是用来存放那些初始化不为0的全局变量。注意:两个都只是存放的全局变量3:代码段:直观理解为函数堆叠而成的。4:栈:栈用来存放局部的变量和函数参数,当一个函数用完这些局部的变量

2018-01-30 21:27:38 137

原创 学习C语言指针的问题

1:*与&的区别:&表示的是某个数的地址,*表示的是取某个指针里面的值,列:int a = 1;int *p = &a;表示的是定一个整型变量a = 1,然后把a的地址给了p,此时p的指针指向a的地址,则p表示的值也为12:若定义了一个int *p则会是什么情况:此时p的地址将会是一个随机的地址,若要定义一个空指针应为int *p = NULL;3:指针当中malloc的作用:ma

2018-01-25 14:50:26 288

原创 学习C语言函数的问题

1:什么是函数的形参:定义一个新的函数时函数后面的变量名2:什么是函数的实参:在主函数中要调用函数时括号中的表达的式子3:函数的调用过程是什么:①:根据函数名找地址,函数名其实为地址      ②:为形参分配空间(形参即为函数后面定义的变量名)5    ③:传值(值传递,即把地址传递)   ④:执行函数体   ⑤:执行完函数之后返回一个值

2018-01-25 14:20:31 336

原创 gcc gdb

gcc的编译过程分为四个过程,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。例如,编译文件test.c,那么整个过程如下:1.预处理gcc -E test.c -o test.i 或 gcc -E test.c可以输出test.i文件中存放着test.c经预处理之后的代码。打开

2018-01-25 13:53:04 157

原创 linux常用命令

Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不开使用系统提供的命令。要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。useradd 格式:useradd 空格 XXX(添加在suqian用户,位置在/home下) 同理: u

2018-01-25 12:38:16 146

空空如也

空空如也

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

TA关注的人

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