自定义博客皮肤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)
  • 收藏
  • 关注

原创 TCP协议如何保证可靠传输

1. 应⽤数据被分割成 TCP 认为最适合发送的数据块。 2. TCP 给发送的每⼀个包进⾏编号,接收⽅对数据包进⾏排序,把有序数据传送给应⽤层。 3. 校验和: TCP 将保持它⾸部和数据的检验和。这是⼀个端到端的检验和,⽬的是检测数据在传 输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报⽂段和不确认收到此报⽂ 段。 4. TCP 的接收端会丢弃重复的数据。 5. 流量控制: TCP 连接的每⼀⽅都有固定⼤⼩的缓冲空间,TCP的接收端只允许发送端发送接收端 缓

2020-10-27 10:41:07 210

原创 Spring事务

Spring 管理事务的⽅式有⼏种? 1. 编程式事务,在代码中硬编码。(不推荐使⽤) 2. 声明式事务,在配置⽂件中配置(推荐使用)声明式事务⼜分为两种: 1. 基于XML的声明式事务 2. 基于注解的声明式事务Spring 事务中哪⼏种事务传播⾏为?⽀持当前事务的情况:1. TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。 2. Transaction.

2020-10-26 17:18:37 147

原创 Spring框架中用到了哪些设计模式?

1. IOC和DI设计模式。2. 工厂设计模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象。3. 单例设计模式:Spring中的Bean对象默认都是单例的。4. 代理设计模式:AOP是基于动态代理实现的。5. 适配器模式:SpringAOP的增强/通知(Advice)以及SpringMVC中的Controller都用到了适配器模式...

2020-10-26 17:07:22 1205

原创 Spring bean

SpringBean的作用域:singleton(默认):为单例模式,唯一的bean实例,当为这个的时候,spring中的对象只创建一次,即外界调用多少次这个对象,都是同一个对象。prototype:多例模式,每次请求都会创建一个新的bean实例对象,actionBean一定要使用prototype多例,其他基本全是默认singleton。Spring 中的单例 bean 的线程安全问题了解吗?单例 bean 存在线程问题,主要是因为当多个线程操作同⼀个对象的时候,对这个对象的⾮静态成员变量

2020-10-26 16:51:04 391

原创 Spring AOP和Aspect AOP有什么区别?

1. Spring AOP属于运行时的增强,而Aspect AOP属于编译时的增强。SpringAOP是基于代理(Proxying),而AspectAOP是基于字节码操作。2. 如果切面比较少,两者差不多,如果切面太多,最好使用AspectAOP,它比SpringAOP快很多。...

2020-10-26 11:50:00 2181

原创 谈谈对SpringIOC和AOP的理解

IOC:控制反转,是一种设计思想,将原本在程序中需要手动创建的对象交给spring框架来管理。(本来对象A需要对象B,需要用对象A来创建对象B,而现在,反转了,对象的创建全部由spring框架来完成,A需要对象B,不需要自己创建,由spring在特定的时候提供给A所需要的对象B,这就是IOC,控制反转,即把自己创建对象反转成交个程序帮忙创建对象。)IOC是由依赖注入实现的(DI),很大程度上简化了应用的开发。AOP:面向切面编程,就是将那些公共的部分封装起来,减少代码的冗余,降低模块耦合度。AOP是基于

2020-10-26 11:45:44 1499

原创 滑动窗⼝和流量控制

TCP利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率。接收方发送的确认报文中的窗口字段可以控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据。...

2020-10-20 20:25:37 223

原创 四次挥手为什么客户端最后还要等待2MSL?

MSL就是指最大的报文生存时间。第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器重新发了一次,客户端就能在这2MSL时间段内收到重传的报文,接着给出回应报文,并且会重启2MSL计时器。第二,客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,这样新的连接中不会出现旧链接的请求

2020-10-20 19:38:15 954

原创 堆内存中对象分配的基本策略?

堆空间的基本结构:上图所示的eden区、s0区、s1区都属于新生代,tentired区属于老年代。对象会先在eden区域分配,在一次新生代垃圾回收之后,如果对象还存活,会进入s0和s1区域,并且对象的年龄还会加一,当对象年龄增加到一定程度,就会晋升到老年代中。大对象和长期存活的对象会直接进入老年代。...

2020-10-19 20:36:43 423

原创 sleep()和wait()的区别和共同点

区别:1. sleep方法没有释放锁,但是wait释放了锁2. wait()被调用后不会自动苏醒,需要别的线程调用同一对象的notify()/notifyAll()方法;而sleep()执行后会自动苏醒。3. wait()通常用于线程之间的通信,而sleep()一般是用于暂停。共同点:两者都可以暂停线程的执行...

2020-10-17 12:29:55 415

原创 什么是线程死锁?如何避免死锁?

线程死锁:多个线程同时被阻塞,他们中的一个或者全部在等待某个资源被释放,由于线程被无限期的阻塞,因此程序不可能正常终止。产生死锁必须具备的四个条件:1.互斥条件:该资源任意时刻只由一个线程占用。2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。3. 不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完之后才释放资源。4. 循环等待条件:若干个进程之间形成一种头尾相接的循环等待资源关系。如何避免线程死锁(破坏其中一个条件即可):1.

2020-10-17 12:25:50 479

原创 表级锁和行级锁的对比

MyISAM采用表级锁,InnoDB支持行级锁和表级锁,一般默认是行级锁。表级锁:MySQL中锁定粒度最大的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也少,加锁快,不会出现死锁。但是锁定粒度大,触发锁冲突的概率最高,并发度低。行级锁:MySQL中锁定粒度最小的一种锁,只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。加锁的开销也大,加锁慢,会出现死锁。加锁粒度最小,并发度高。...

2020-10-17 10:27:13 1570

原创 事务隔离级别有哪些?MySQL的默认隔离级别是?

SQL标准定义了四个隔离级别:READ-UNCOMMITTED(读未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读仍有可能发生。REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务所修改,可以阻止脏读和不可重复读,但是幻读仍有可能发生。SERIALIZABLE(可串行化):最高的隔离级别,完全服从A

2020-10-15 16:58:13 432

原创 并发事务带来哪些问题?

多个事务并发运行,经常会通过操作相同的数据来完成各自的任务(多个用户对同一数据进行操作),并发虽然是必须的,但是会导致以下的问题。1. 脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另一个事务读到的这个数据是“脏数据”,依据“脏数据”做的操作是不正确的。2. 不可重复读:指在一个事务内多次读同一数据。在这个事务还没有结束的时,另一个事务也访问该数据。那么,在第一个事务中的两次读

2020-10-13 22:42:55 3176

原创 事务的四个特性

ACID1. 原子性:事务是最小的执行单位,不可分割,事务的原子性确保动作要么全部完成,要么完全不起作用。2. 一致性:事务执行前后,数据保持一致,多个事务对同一个数据读取的结果是相同的。3. 隔离性:并发访问数据库时,一个用户的事务不被其他事务干扰,各并发事务之间数据库相互独立的。4. 持久性:一个事务被提交后,它对数据库中数据的改变是持久的。...

2020-10-13 20:46:35 254

原创 什么是事务

事务是逻辑上的一种操作,要么都执行,要么都不执行。举个例子就是:A给B转账1000块,A余额减少1000,B账户增加1000,如果银行系统崩溃,A减少了但是B没有增加,这就不对了,事务保证这两个操作要么同时成功,要么同时失败。...

2020-10-13 20:35:48 116

原创 MyISAM和InnoDB的区别

5.5版本以前,MyISAM是MySQL的默认数据库引擎,虽然性能极佳,而且提供了大量的特性,但是MyISAM不支持事务和行级锁,最大的缺陷是崩溃后无法安全恢复;5.5版本以后,MySQL引入了InnoDB(事务性数据库引擎),而且默认存储引擎为InnoDB。大多数情况下我们使用的是InnoDB,但是某些情况下使用MyISAM也是比较合适的,比如读密集的情况下。两者对比:1. 是否支持行级锁:MyISAM只有表级锁,而InnoDB支持行级锁和表级锁,默认为行级锁。2. 是否支持事务和崩溃后的安全

2020-10-13 20:24:04 92

原创 ConcurrentHashMap和HashTable的区别?

ConcurrentHashMap和HashTable的区别主要体现在实现线程安全的方式上的不同:底层数据结构:jdk7之前的ConcurrentHashMap底层采用的是分段的数组+链表实现,jdk8之后采用的是数组+链表/红黑树;HashTable采用的是数组+链表,数组是主体,链表是解决hash冲突存在的。实现线程安全的方式:1. jdk8以前,ConcurrentHashMap采用分段锁,对整个数组进行了分段分割,每一把锁只锁容器里的一部分数据,多线程访问不同数据段里的数据,就不会存在锁竞争

2020-10-11 17:16:47 544

原创 ConcurrentHashMap线程安全的具体实现⽅式/底层具体实现

JDK8以前,ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他段访问。Segment是一种数组+链表结构,实现了ReentrantLock接口,是一种可重入锁;HashEntry存储键值对数据。JDK8以后,ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized保证并发安全。数据结构采用数组+链表/红

2020-10-11 16:52:25 447

原创 集合框架底层数据结构总结

Collection1. List: ArrayList:Object数组 Vector:Object数组 LinkedList:双向链表2. Set: HashSet:无序,唯一,底层是HashMap LinkedHashSet:底层依赖LinkedHashMap实现。 TreeSet:有序,唯一Map HashMap:jdk8以前是数组+链表,jdk8以后是数组+链表/红黑树 LinkedHashMap:有序...

2020-10-10 16:55:09 127

原创 HashSet如何检查重复?

当把对象加入HashSet的时候,HashSet会先计算对象的hashCode值来判断对象加入的位置,同时与其他加入的对象的hashcode值作比较,如果没有相同的,则加入该对象,如果有相同的hashcode值,则调用equals方法判断是不是同一个对象,如果不是则加入;如果相同,则加入不成功;...

2020-10-10 16:35:47 264

原创 List,Set,Map三者的区别?

List:存储有序的对象Set:不允许重复的集合,独一无二Map:使用键值对存储,Key是唯一的。

2020-10-10 16:08:15 244

原创 hashcode与equals

1. hashcode()的作用是获取哈希码返回一个int的整数,哈希码的作用是确定对象在哈希表中的位置。当对象加入hashset时,HashSet会先计算对象的hashcode,判断该位置上有无相同的hashcode,如果有会再调用equals方法检查hashcode相同的对象是否为同一个对象;如果该位置上没有相同的hashcode,则说明该对象没有重复,可以加入hashset。2. 如果两个对象hashcode相等,两个对象不一定相等;如果两个对象相等,hashcode一定相等,且equals方法返

2020-10-08 19:15:34 110

原创 关于final关键字的总结

final关键字主要用在3个地方:变量,类,方法变量:final修饰是成员变量,如果是基本数据类型,在赋初值后不能改变;如果是引用数据类型,在初始化之后不能指向另一个对象。类:当用final修饰一个类的时候,说明这个类是不能被继承,且类里的所有方法被隐式的指定为final方法。方法:final修饰方法,任何类继承该类不能修改这个方法。所有的private方法都隐式的被指定为final...

2020-10-08 16:44:38 149

原创 深拷贝vs浅拷贝

1. 浅拷贝:对基本的数据类型进行值传递,对引用数据类型只是增加了一个指向同一个堆里对象的指针,这是浅拷贝。2. 深拷贝:对基本的数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,这是深拷贝。...

2020-10-08 16:30:24 64

原创 java中序列化如果有些字段不想进行序列化怎么办

对于不想被序列化的变量,用transient关键字修饰。transient关键字的作用就是:阻止用这个关键字修饰的不想被序列化的变量序列化;transient只能修饰变量,不能修饰类和方法。

2020-10-08 16:09:08 1228

原创 成员变量和局部变量的区别

1. 从语法形式上:成员变量属于类,局部变量属于方法或者方法的参数;成员变量可以被public,protected,private和static修饰,局部变量不可以;但是二者均可以被final关键字修饰。2.从变量在内存的存储方式上:如果成员变量是static修饰,那么这个成员变量属于类,如果没有static修饰,那么这个成员变量属于实例;对象存于堆内存,如果局部变量为基本数据类型,那么存储在栈内存,如果为引用数据类型,那存放的是指向堆内存对象的引用或者指向常量池中的地址。3. 从变量在内存中的生存

2020-10-08 11:58:21 597

原创 在一个静态方法里调用一个非静态成员为什么是非法的

因为静态方法可以不通过对象进行调用,可以直接类名.静态方法,所以静态方法里不可以直接调用或访问费静态成员变量。

2020-10-08 10:57:20 337

原创 String、StringBuilder、StringBuffer的区别?为什么说String是不可变的

1. String类中使用final关键字修饰字符数组,private final char[] value,所以String类是不可变的。2. StringBuffer和StringBuilder都是继承AbstractStringBuilder父类,从线程安全性上来说StringBuffer的方法有同步锁,是线程安全的,StringBuilder不是线程安全的。3. 从性能上来说StringBuilder比StringBuffer更快点。总结:少量数据用String,单线程下大量数据用Str

2020-10-08 10:54:41 177

空空如也

空空如也

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

TA关注的人

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