• 前言
  • JAVA I/O
  • 字符串操作的线程安全性问题
  • 代理
  • Java静态代理:
  • Java动态代理:
  • JDK和CGLIB生成动态代理类的区别:
  • Session与Cookie
  • Session与Cookie简介
  • 分布式Session框架
  • 进程间的通信方式


前言

Java进阶知识点博客是一个非常好的知识点总结目录,这里主要按照个人需求挑选一些特定的内容进行进一步的学习、总结、归纳。

JAVA I/O

字符串操作的线程安全性问题

1.首先明确String,StringBuffer,StringBuilder的区别:
String是字符串常量,StringBuffer与StringBuilder都是字符串变量;
因此,String类型的常量操作本质上是辞旧迎新的过程,

String s = "abcd";
s = s+1;
System.out.print(s);// result : abcd1

每次字符串常量的拼接实际上是旧字符串常量在内存拼接完成后再赋值给新的字符串常量对象的过程。
StringBuffer与StringBuilder则是使用变量操作,操作过程中无需生成新的对象,因此节约了部分开销。
此外,StringBuffer由于对字符串缓存的操作过程使用了Syn锁来确保线程安全性,因此其操作效率相对StringBuilder较低
2.三者操作效率:StringBuilder > StringBuffer > String
3.字符串拼接使用优先级:
考虑线程安全性使用StringBuffer,不考虑使用StringBuilder
4.此外需注意编译器对于一些字符串操作会进行优化。
如 String str = “This is only a” + “ simple” + “ test”; 在编译器中其实被直接处理为一个字符串而未产生字符串拼接操作。

代理

代理的共有优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。

Java静态代理:

代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,代理对象可以在调用目标对象相应方法前后加上其他业务处理逻辑。
缺点:一个代理类只能代理一个业务类。如果业务类增加方法时,相应的代理类也要增加方法。

Java动态代理:

Java动态代理是写一个类实现InvocationHandler接口,重写Invoke方法,在Invoke方法可以进行增强处理的逻辑的编写,这个公共代理类在运行的时候才能明确自己要代理的对象,同时可以实现该被代理类的方法的实现,然后在实现类方法的时候可以进行增强处理。
实际上:代理对象的方法 = 增强处理 + 被代理对象的方法

JDK和CGLIB生成动态代理类的区别:

JDK动态代理只能针对实现了接口的类生成代理(实例化一个类)。此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑
CGLIB是针对类实现代理,主要是对指定的类生成一个子类(没有实例化一个类),覆盖其中的方法 。
Spring AOP应用场景
性能检测,访问控制,日志管理,事务等。
默认的策略是如果目标类实现接口,则使用JDK动态代理技术,如果目标对象没有实现接口,则默认会采用CGLIB代理

Session与Cookie

Session与Cookie简介

Cookie可以让服务端跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些Cookie,如果Cookie很多,则无形的增加了客户端与服务端的数据传输量,
而Session则很好地解决了这个问题,同一个客户端每次和服务端交互时,将数据存储通过Session到服务端,不需要每次都传回所有的Cookie值,而是传回一个ID,每个客户端第一次访问服务器生成的唯一的ID,客户端只要传回这个ID就行了,这个ID通常为NAME为JSESSIONID的一个Cookie。这样服务端就可以通过这个ID,来将存储到服务端的KV值取出了。
Session和Cookie的超时问题,Cookie的安全问题

分布式Session框架

配置服务器,Zookeeper集群管理服务器可以统一管理所有服务器的配置文件
共享这些Session存储在一个分布式缓存中,可以随时写入和读取,而且性能要很好,如Memcache,Tair。
封装一个类继承自HttpSession,将Session存入到这个类中然后再存入分布式缓存中
由于Cookie不能跨域访问,要实现Session同步,要同步SessionID写到不同域名下。

进程间的通信方式

  1. 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
  2. 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
  3. 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  4. 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  5. 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  6. 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  7. 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。