JAVA中级开发应该掌握的小知识点

一.悲观锁、乐观锁的区别:

悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行,只有一个线程可以执行,其他线程在入口处等待,直到锁被释放。
乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行,可以同时进入执行,在最后跟新数据时候检查这些数据是否被其他线程修改,
版本和执行初是否相同),没有修改进行跟新,有就放弃这次操作。
//0.开始事务
begin;/begin work;/start transaction; (三者选一就可以)
//1.查询出商品信息
select status from t_goods where id=1 for update;
//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status为2
update t_goods set status=2;
//4.提交事务
commit;/commit work;


1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
2.根据商品信息生成订单
3.修改商品status为2
update t_goods
set status=2,version=version+1
where id=#{id} and version=#{version};


 

二.mysql的优化:

1.尽量避免全表查询,在where和order by 后面建立索引

2.尽量避免where条件后面使用!=和<>的操作符,否则会引起引擎放弃索引而走全表查询

3.尽量使用数字型字段,不要设计为字符型字段,,这样会降低查询和链接性能,并会增加存储开销
这是因为引擎在处理查询和链接时候会逐个比较字符串中每个字符,而数字型而言只需要一次


 

三.线程池:

在初始化一个多线程程序中创建的一个线程集合,然后在需要执行新的任务时候重用这些线程而不是新建一个线程。

好处:
1、线程池改进了一个应用程序的响应时间。由于线程池中的线程已经准备好且等待被分配任务,应用程序可以直接拿来使用而不用新建一个线程。

2、线程池节省了CLR 为每个短生存周期任务创建一个完整的线程的开销并可以在任务完成后回收资源。

3、线程池根据当前在系统中运行的进程来优化线程时间片。

4、线程池允许我们开启多个任务而不用为每个线程设置属性。

5、线程池允许我们为正在执行的任务的程序参数传递一个包含状态信息的对象引用。

6、线程池可以用来解决处理一个特定请求最大线程数量限制问题。


 

四.JVM里面的概念:

1、Java虚拟机栈:

线程私有;每个方法在执行的时候会创建一个栈帧,存储了局部变量表,操作数栈,动态连接,方法返回地址等;每个方法从调用到执行完毕,
对应一个栈帧在虚拟机栈中的入栈和出栈。

2、堆:
线程共享;被所有线程共享的一块内存区域,在虚拟机启动时创建,用于存放对象实例。

3、方法区:
线程共享;被所有线程共享的一块内存区域;用于存储已被虚拟机加载的类信息,常量,静态变量等。

4、程序计数器:
线程私有;是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。

5、本地方法栈:
线程私有;主要为虚拟机使用到的Native方法服务。


 

五.TCP三次握手

TCP三次握手:
三次握手就是建立一个TCP连接,里面客户端和服务端总共发3个包以确定连接的建立。在socket编程中由客户端执行
connect来触发。

TCP三次握手.png
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,
等待Server确认。

(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,
随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据
包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,
完成三次握手,随后Client与Server之间可以开始传输数据了。

简单来说,就是

1、建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认

2、服务器收到SYN包,必须确认客户的SYN(ack=i+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN-RECV状态

3、客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,
完成三次握手,客户端与服务器开始传送数据。


 

六.TCP四次挥手.png

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向
的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,
直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),
Server进入CLOSE_WAIT状态。

(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入
CLOSED状态,完成四次挥手。


七.Kafka、ActiveMQ、RabbitMQ、RocketMQ

一般的业务系统要引入 MQ,最早大家都用 ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,
所以大家还是算了吧,我个人不推荐用这个了;

后来大家开始用 RabbitMQ,但是确实 erlang 语言阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,
但是确实人家是开源的,比较稳定的支持,活跃度也高;

不过现在确实越来越多的公司会去用 RocketMQ,确实很不错,毕竟是阿里出品,但社区可能有突然黄掉的风险(目前 RocketMQ
已捐给 Apache,但 GitHub 上的活跃度其实不算高)对自己公司技术实力有绝对自信的,推荐用 RocketMQ,否则回去老老实实用
RabbitMQ 吧,人家有活跃的开源社区,绝对不会黄。

所以中小型公司,技术实力较为一般,技术挑战不是特别高,用 RabbitMQ 是不错的选择;大型公司,基础架构研发实力较强,
用 RocketMQ 是很好的选择。

如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况
几乎是全世界这个领域的事实性规范。


 

八.HashMap源码解析(jdk1.8):

HashMap结构在jdk1.2开始出现,一直到jdk1.7一直没有太多变化,在1.8后有个大变化
jdk1.7:数组+链表(增删效率高)
jdk1.8:数组+链表+红黑(查询效率也变快了)

红黑树只有在链表长度不小于8,而且数组长度不小于64才可以转化为红黑树

什么是红黑树:一个自平衡的二叉查找树,也就是说红黑树的查询效率更高


九.单例模式:

懒汉式单例

public class Singleton {
private static Singleton singleton = null;
private Singleton(){
}
public synchronized static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}

饿汉式单例:

public class Singleton {
private static final Singleton singleton = new Singleton();
private Singleton(){
}
public static Singleton getSingleton(){
return singleton;
}
}

Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 使用Singleton的好处还在于可以节省内存,
因为它限制了实例的个数,有利于Java垃圾回收


十.sql中exists 和not exists用法:

exist:强调的是返回的结果集,而不要求知道返回的是什么(exists子句不在乎返回什么,而是在乎是不是有结果集返回)

exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:
select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...)

,in子句返回了三个字段,这是不正确的,exists子句是允许的,但in只允许有一个字段返回,在1,2,3中随便去了两个字段即可。


十一.SOA:SOA又叫服务治理,帮助我们把服务之间调用的系统治理起来

统一标准:各系统的协议、地址、交互方式。
新的交互方式:各个系统分别根据统一标准向数据总线进行注册,各子系统调用其他子系统时,我们并不关心如果找到其他子系统,
我们只招数据总线,数据总线再根据统一标准找其他子系统,所以数据总线在这里充当一个只路人的作用。

SOA的好处:

1、降低用户成本,用户不需要关心各服务之间是什么语言的、不需要知道如果调用他们,只要通过统一标准找数据总线就可以了。

2、程序之间关系服务简单

3、识别哪些程序有问题(挂掉)

缺点:提示了系统的复杂程度,性能有相应影响。

目前应用数据总线的有阿里的dubbo,还有zookeeper。

 

 

 

猜你喜欢

转载自www.cnblogs.com/Cjx-605/p/11422435.html