java一些重要知识以及疑点

同步和异步的区别

同步的理解:

同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,知道收到返回信息才会继续执行下去;

同步就相当于,当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。这样的话客户端需要一直等待。用户使用起来会有不友好。

举个项目中用到同步的例子:
      详情页渲染需要调接口来完成客户和部门两个字段的渲染,新建页面的逻辑是必须先选择客户,拿到客户的id再去请求部门的接口,所以我调详情页接口的时候一开始没考虑到这个问题直接渲染,结果就是出错,因为代码从上到下执行,是异步请求,我的客户还没请求成功的同时,部门也已经请求完了,解决方法,我就是接口套接口,把请求部门的接口写在客户端接口的里面,形成同步请求,先请求完成之后再去调接口!
异步的理解为:

异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回系统会通知进程进行处理,这样可以提高执行的效率。
异步就相当于客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高效率。

存在即合理,异步虽然好,但是有些问题是要用同步用来解决,比如有些东西我们需要的是拿到返回的数据在进行操作的。这些是异步所无法解决的。

ps

。在前端开发中常见的异步一般包括:setTimeout,setInterval,ajax。
。setTimeout是定时延时运行函数,只执行一次。
。ajax是前端常用的和后台进行异步交互数据的请求方式,其实它本身包括同步和异步,同步的就是由代码从上到下顺序执行,而异步的ajax是我们发送请求到服务器之后,只需要在监听服务器的响应即可,不用等到请求结束在执行其他的代码,这就是异步ajax。

摘要

https://blog.csdn.net/hong521520/article/details/106671930

@NotEmpty要和@Validated 搭配用,不然@NotEmpty不起效果

池化技术

概念

池化技术:把一些能够复用的东西(比如说数据库,线程)放到池中,避免重复创建,销毁的开销,从而极大的提高性能。

在开发过程中我们会用到很多的连接池,像是数据库连接池,HTTP连接池,Redis连接池等等。而连接池的管理是连接池设计的核心,以数据库连接池为例,来说明一下连接池管理的关键点。

数据库连接池

数据库连接池有两个最重要的配置:最小连接数和最大连接数,它们控制着从连接池中获取连接的流程:
1,如果当前连接数小于最小连接数,则创建新的连接处理数据库请求。
2,如果线程池中有空闲连接,则使用空闲连接。
3,如果没有空闲连接,并且当前连接数小于最大连接数,则继续创建新的连接。
4,若果当前连接数大于等于最大连接数,并且没有空闲连接了,则请求按照超时时间等待旧连接可用。
5,超时之后,则获取数据库连接失败。
对于数据库连接池,根据我的经验,一般在线上我简历最小连接数控制在10左右,最大连接数控制在20-30左右即可。
数据库故障的原因可能有下面几种:
1.数据库的域名对象的IP发生了变更,池子的连接还是使用旧的IP,当旧的IP下数据库服务关闭厚,再使用这个连接查询就会发生错误;
2,MYSQL有个参数是“”wait_timeout“”,控制着数据库连接闲置多长时间后,数据库会主动的关闭这条连接。这个机制对于数据库使用方是无感知的,所以当我们使用这个被关闭的连接时就会发生错误。

那么怎么去避免这种错误呢?
1,启动一个线程来定期检测连接池中的连接是否可用,比如使用连接发送“select 1”的命令给数据库看是否会抛出异常,如果抛出异常则将这个连接从连接池中移除,并且尝试关闭。目前C3P0连接池(开发源代码的JDBC连接池)可以采用这种方式来检测连接是否可用,也是我比较推荐的方式。
2,在获取到连接之后,先校验连接是否可用,如果可用才会执行SQL语句。比如DBCP连接池的testOnBorrow配置项,就是控制是否开启这个验证。这种方式在获取连接时会引入多余的开销,在线上系统中还是尽量不要开启,在测试服务上可以使用。

线程池

JDK1.5中引入的ThreadPoolExcutor就是一种线程池的实现,它有两个重要的参数:coreThreadCount和maxThreadCount,这两个参数控制着线程池的执行过程。它的执行原理如下:
1,如果线程池中的线程数少于coreThreadCount时,处理新的任务时会创建新的线程
2,如果线程数大于coreThreadCount则把任务丢到一个队列里面,由当前空闲的线程执行
3,当队列中的任务堆积满了的时候,则继续创建线程,直到达到maxThreadCount。
4,当线程数达到maxThreadCount时则把任务丢到一个队列里面,由当前空闲的线程执行
在这里插入图片描述
这个任务处理流程看似简单,实际上有很多坑,你在使用的时候一定要注意。

首先,JDK实现的这个线程池优先把任务放入队列暂存起来,而不是创建更多的想成,它比较适用于执行CPU密集型的任务,也就是需要执行大量的cpu运算的任务。这是为什么呢?因为执行CPU密集型的任务时CPU比较繁忙,因此只需要创建和CPU核数相当的线程就好了,多了反而会造成线程上下文切换,降低任务执行效率,所以当当前线程数超过核心线程数时,线程池不会增加线程,而是放在队列里等待核心线程空闲下来。

但是,我们平时开发的web系统通常都有大量的IO操作,比方说查询数据库,查询缓冲等等。任务在执行IO操作的时候CPU就空闲了下来,这时如果增加执行任务的线程数而不是把任务暂存在队列中,就可以在单位时间执行更多的任务,大大提高了任务执行的吞吐量。所以你看Tomcat使用的线程池就不是JDK原生的线程池,而是做了一些改造,当线程数超过coreThreadCount之后会优先创建线程,直到线程数到达maxThreadCount,这样就比较适合于Web系统大量IO操作的场景了,你在实际运用过程中也可以参考借鉴。

其次,线程数到达maxThreadCount,这样就比较适合于Web系统大量IO操作的场景了,你在实际运用过程中也可以参考借鉴。

其次,线程池中使用的队列的堆积量也是我们需要监控的重要指标,对于实时性要求比较高的任务来说,这个指标尤为关键。

我在实际项目中就曾经遇到过任务被丢给线程池之后,长时间都没有被执行的诡异问题。最初,我认为
这时代码的bug导致的,后来经过排查发现,是因为线程池的coreThreadCount和maxThreadCount设置的比较小,导致任务在线程池里面的大量堆积,在调大了这两个参数之后问题就解决了(任务早早被方放到队列中堆积着,并且由于coreThreadCount比较小,导致工作线程比较少,处理速度较慢)。跳出这个坑之后,我就把重要线程池的队列任务堆积量,作为一个重要的监控指标放到了系统监控大屏上。

最后,如果你使用线程池请一定记住不要使用无界队列(即没有设置固定大小的队列)。也许你会觉得使用了无界队列后,任务就永远不会被丢弃,只要任务对实时性要求不高,反正早晚有消费完的一天。但是,大量的任务堆积会占用大量的内存空间,一旦内存空间被占满,就会频繁的触发Full GC,造成服务不可用,我之前排查过的一次GC引起的宕机,起因就是系统中的线程池使用了无界队列。

不过,池化技术也存在一些缺陷,比方说存储池子中的对象肯定需要消耗多余的内存,如果对象没有被频繁使用,就会造成内存上的浪费。在比方说,池子中的对象需要再系统启动的时候就预先创建完成,这在一定程度上增加了系统启动时间。

总结

连接池和线程池你并不陌生,不过你可能对它们的原理和使用方式上还存在困惑或者误区。重点:

1,池子中的最大值和最小值的设置很重要,初期可以根据经验设置,后面还需要根据实际情况调整。
2,池子中的对象需要在使用之前预先初始化完成,这较池子的预热,比方说使用线程池时就需要预先初始化所有核心线程。如果池子未经过预热可能会导致系统重启后产生比较多的慢请求。
3,池化技术核心是一种空间换时间优化方法的实践,所以要关注空间占用情况,避免出现空间过度使用内存泄漏或者频繁垃圾回收等问题。

IOC的概率和原理

(1)控制反转:

IOC-Inversion pf Control ,即“控制反转”,不是什么技术,而是一种设计思想

  控制:IOC意味着将你设计好的对象交给IOC容器控制,而不是传统的在你的对象内部直接控制;
       IOC是有专门一个容器来创建这些对象,即由IOC容器来控制对象的创建;
       谁控制谁?当然是IOC容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

  反转 :传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;
       反转是由IOC容器帮忙创建及注入依赖对象;
       由容器帮我们查找及注入依赖对象,对象知识被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

在这里插入图片描述
在这里插入图片描述

spring提供IOC容器实现两种方式:(两个接口)

第一种:BeanFactory,可以对IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
【加载配置文件的时候不会创建对象,在获取对象(也就是说在使用的时候)才会创建对象】

第二种:ApplcationContext,是BeanFactory接口的子接口,提供更多强大的功能,一般由开发人员使用
【加载配置文件的时候会把在配置文件中的对象进行创建】

*一般推荐使用第二种,因为Spring框架,要结合web项目进行操作,通俗点来说就是用tomcat服务器进行启动,因此把这些耗时耗内存的都在项目启动的时候进行处理更加合适。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值