2019年面试准备

1.保证线程安全的关键字有哪些?都修饰什么?

(1)synchronized关键字

-synchronized方法和 synchronized块。

(2)volatile关键字

-可见性:原理是:缓存一致性协议

-有序性:JVM虚拟机在运行程序的时候,会重新排序,volatile关键字的作用是,在volatile关键字前面的程序一定在volatile前面执行,而在volatile关键字之后的程序,一定在volatile关键字之后执行。

(3)AtomicInteger修饰一个Integer类

-AtomicInteger提供原子操作来进行Integer的使用,因此十分适合高并发情况下的使用

(4)Lock锁-重入锁(ReentrantLock)


2.java读取大文本文件数据

正常读取小文本文件用InputStream和FileReader来读取,但是遇到大文件的话,就需要切割大文件,使用多线程来处理

在JAVA中也提供了两个读取大文件的类,一个是java.util.Scanner类,另一个是Apache Commons IO流

-java.util.Scanner:对大文件进行逐行扫描,允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中

-Apache Commons IO流:利用该库提供的自定义LineIterator,由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗


3.说说常用的设计模式?

(1)单例模式:

(2)工厂模式:

(3)代理模式:

 

(4)适配器模式:

(5)观察者模式:

(6)建造者模式:

  • Builder:为创建一个Product对象的各个部件指定抽象接口。
  • ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口
  • Director:构造一个使用Builder接口的对象。
  • Product:表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。

(7)装饰模式:

基本概念:装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。


4.MySQL中group by,having,order by的查询数据的顺序

-写的顺序:select ... from... where.... group by... having... order by..
-执行顺序:from... where...group by... having.... select ... order by...

5.事务有哪些特性

-原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做
-一致性:数据不会因为事务的执行而遭到破坏
-隔离性:一个事物的执行,不受其他事务的干扰,即并发执行的事物之间互不干扰
-持久性:一个事物一旦提交,它对数据库的改变就是永久的

    <!-- 定义事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!--使用注释事务 -->
    <tx:annotation-driven  transaction-manager="transactionManager" />

 

6.数据库事务隔离级别

-ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别,另外四个与JDBC的隔离级别相对应  
-ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据,这种隔离级别会产生脏读,不可重复读和幻像读。  
-ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据  
-ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读,它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。  
-ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行,除了防止脏读,不可重复读外,还避免了幻像读。  


7.事务的传播属性

-PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启  
-PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行  
-PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。  
-PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。  
-PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。  
-PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常  
-PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行

8.mybatis做一个spring项目的过程,如果建项目 配置文件

-MyBatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下:
-properties(属性):将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。
-setting(全局配置参数):开启二级缓存、开启延迟加载......
-typeAliases(类名别名)
-typeHandlers(类名处理器):MyBatis中通过typeHandlers完成jbdc类型和java类型的转换。通常情况下,MyBatis提供的类型处理器满足日常需要,不需要自定义。
-objectFactory(对象工厂)
-plugins(插件)
-environments(环境集合属性对象)
----environment(环境子属性对象)
----transationManager(事务管理)
----dataSource(数据源)
-mappers(映射器)

9.spring mvc 处理httprequest的过程


10.springboot和springmvc的区别


11.springboot如何使用redis

springboot框架对redis已经封装了相关的依赖,使用时只需要在pom.xml配置文件中引入spring-boot-starter-data-redis就可以了

(1)pom.xml引入jar包

(2)修改项目启动类,增加注解@EnableCaching,开启缓存功能

(3)application.properties中配置Redis连接信息

(4)新建Redis缓存配置类RedisConfig


12.线程池怎么创建,有哪些类型

Java通过Executors提供四种线程池,分别为:
-newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
-newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
-newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
-newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。


13.Volitel关键字的作用


14.aotmic原子类型的原理

(1)Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。
(2)原子类其内部实现不是简单的使用synchronized,而是一个更为高效的方式CAS (compare and swap) + volatile和native方法(同步的工作更多的交给了硬件),从而避免了synchronized的高开销,执行效率大为提升
(3)虽然基于CAS的线程安全机制很好很高效,但要说的是,并非所有线程安全都可以用这样的方法来实现,这只适合一些粒度比较小,型如计数器这样的需求用起来才有效,否则也不会有锁的存在了
(4)在Atomic包里一共有12个类,四种原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新字段。Atomic包里的类基本都是使用Unsafe实现的包装类。 


15 .CopyOnWriteArrayList实现原理

CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也可以称这种容器为"写时复制器",Java并发包中类似的容器还有CopyOnWriteSet。

(1)优点:
-读操作性能很高,因为无需任何同步措施,比较适用于读多写少的并发场景。

(2)缺点:
-一是内存占用问题,毕竟每次执行写操作都要将原容器拷贝一份,数据量大时,对内存压力较大,可能会引起频繁GC;

-二是无法保证实时性,Vector对于读写操作均加锁同步,可以保证读和写的强一致性。而CopyOnWriteArrayList由于其实现策略的原因,写和读分别作用在新老不同容器上,在写操作执行过程中,读不会阻塞但读取到的却是老容器的数据。

16.@Controller和@RestController的区别?

@RestController注解相当于@ResponseBody+ @Controller合在一起的作用。

(1)如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面或者html页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return里的内容。

(2)如果需要返回到指定页面,则需要用@Controller配合视图解析器InternalResourceViewResolver才行。

(3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

17.如何设置springmvc response的contentType

通过注解@RequestMapping 中的produces设置

(1)response 的content type主要有:
-text/html
-text/plain
-application/json;charset=UTF-8
-application/octet-stream

18.常用的httpstatus 503 400

(1)1xx:Informational(指示信息),表示请求已接收,继续处理
(2)2xx:Success(请求成功),表示请求已被成功接收

-200:客户端请求成功。
-204:请求处理成功,但没有资源科返回。204不允许返回任何实体的主体。
-206:客户发送了一个带有Range头的GET请求,服务器完成了它。使用video去播放视频,返回206,说明视频范围。
(3)3xx:Redirection(重定向),完成请求,必须进行更进一步的操作

-301:永久重定向。该状态码表示请求的资源已被分配了新的URI,以后应按 Location 首部字段提示的 URI 重新保存。
-302:和 301 Moved Permanently 状态码相似,但 302 状态码代表的资源不是被永久移动,只是临时性质的。
-303:303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确表示客户端应当采用 GET 方法获取资源。
-304:虽然被划分在 3XX 类别中,但是和重定向没有关系。资源已找到,但未符合条件请求。
(4)4xx:Client Error(客户端错误),请求有语法错误或者请求无法实现

-400:请求报文中存在语法错误。当错误发生是,需要修改请求的内容后再次发送请求。
-401:返回含有 401 的响应必须包含一个适用于被请求资源的 WWW-Authenticate首部用以质询(challenge)用户信息。当浏览器初次接收到 401 响应,会弹出认证用的对话窗口。
-403:该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由。
-404:该状态码表明服务器上无法找到请求的资源。
(5)5xx:Server Error(服务端错误),服务器处理请求出错

-500:服务器本身发生错误。也有可能是 Web应用存在的 bug 或某些临时的故障
-503:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

19.java动态代理如何实现,都用到了哪个类

java动态代理有两种实现方式

(1)JDK动态代理

JDK动态代理是通过接口InvocationHandler中的方法名,在动态生成的代理类中调用业务实现类的同名方法;

(2)CGlib动态代理

CGlib动态代理是通过继承MethodInterceptor业务类,生成的动态代理类是业务类的子类,通过重写业务方法进行代理;

20.如何设置httpstatus的自定义的code

(1)第一种

response.setStatus

(2)第二种

-int myCode=601;  
-response.setResponseCode(myCode);  
-request.setAttribute("javax.servlet.error.status_code",myCode); 

(3)第三种

-如果使用了spring框架,也可继承SimpleMappingExceptionResolver,调用它的applyStatusCodeIfPossible(requset,response,code) 方法 

21.跨域问题如何处理

当前端页面与后台运行在不同的服务器时,就必定会出现跨域这一问题

(1)response添加header

-在Servlet请求返回时添加如下代码:表示支持所有网站访问,也可以额外配置相应网站

-resp.setHeader("Access-Control-Allow-Origin", "*");

(2)JSONP 方式

(3)HttpClient请求转发

-这种方式相当于绕过浏览器的同源机制,直接通过后端进行转发。

(4)nginx转发

-利用nginx反向代理,将请求分发到部署到相应项目的tomcat服务器,当然也不存在跨域问题。

22.同源策略

同源策略它是由 Netscape 提出的一个安全策略,它是浏览器最核心也是最基本的安全功能,如果缺少同源策略,则浏览器的正常功能可能都会受到影响,现在所有支持JavaScript的浏览器都会使用这个策略。

-协议、域名、端口号都相同,只要有一个不相同,那么都是非同源。

同源策略限制的情况:
-Cookie、LocalStorage 和 IndexDB 无法读取
-DOM 和 Js对象无法获得
-AJAX 请求不能发送
-注意:对于像 img、iframe、script 等标签的 src 属性是特例,它们是可以访问非同源网站的资源的。


23.httpbasic的原理

basic即为BASE64加密

(1)客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:
(2)服务器向客户端发送验证请求代码401
(3)当客户端收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。
(4)用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息
(5)服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端;

24.SLF4J和Log4J的关系

-SLF4J不同于其他日志类库,与其它日志类库有很大的不同。SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志类库。

-log4j和logback是具体的日志框架。


25.maven如何标示一个dependency的ArtifactID、GroupID、Version

-GroupID 是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构。 
-ArtifactID是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。 
-Version指定了项目的当前版本。

26.maven的pom继承依赖dependencyManagement

-maven的多项目结构中,可以使用parent定义起父项目,从而从父项目中继承依赖等属性。但是美中不足,maven只能单继承,即一个项目只能使用parent标签定一个父级项目。
-maven2.9之后的版本引入了一个新的功能,可以实现依赖上的多继承。这个功能,可以将依赖配置复杂的pom文件拆分成多个独立的pom文件,一是可以使maven的pom配置更加简洁,另一个是,可以复用这些pom依赖。
-dependencyManagement的功能可以参照springboot的spring-boot-starter-web功能,将所有的依赖统一引入

27.spring factory bean 举例说几个

28.redis 如何设置缓存过期时间,为什么redis快,内存 NIO

(1)设置失效时间
-EXPIRE key seconds,seconds是一个数字,即设置key在seconds秒之后失效,second要求是整数,即最少是1秒。当键不存在或者设置失败会返回0,否则返回1。
-PEXPIRE key millsecond,相当于设置毫秒,PEXPIRE key 1000 等效于EXPIRE key 1。
-EXPIREAT key unixtime,将key的过期时间以unix时间进行设置,单位是秒。
-PEXPIREAT key unixmilltime,与3的区别是这个是设置毫秒的。

jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, 1800)
(2)查看还有多久有效
-TTL key,返回值是剩余的时间,单位是秒。如果不存在,则返回-2;如果没有设置过期时间,则返回-1。(这是redis2.8版的,2.6版则不存在和没有设置过期都是-1)
-PTTL key,返回剩余的毫秒数。
(3)取消时间限制
-PERSIST key,则此时再对key进行TTL命令查看,会发现返回-1。
-重新SET key value,则此时会清除原来的时间限制。因此如果对值进行重新设置,需要重新设置失效时间。
-重新expire key seconds,则会重置key的失效时间。
-除了set,其他只对键值进行操作的命令,如lpush、hset、incr等均不会影响过期时间。

29.tomcat的参数配置

(1)修改端口号
Tomcat端口配置在server.xml文件的Connector标签中,默认为8080,可根据实际情况修改。

Tomcat中å ä¸ªå¸¸ç¨åæ°çéç½®

(2)解决URL中文参数乱码
在server.xml文件的Connector标签中增加URIEncoding="GBK"属性,解决中文参数乱码问题。

Tomcat中å ä¸ªå¸¸ç¨åæ°çéç½®

(3)调整Tomcat连接参数

Tomcat中å ä¸ªå¸¸ç¨åæ°çéç½®

(4)增大可用内存

在catalina.sh脚本文件(windows系统下是catalina.bat文件)中设置JAVA_OPTS参数的值。-Xms指Tomcat启动时的初始内存大小, -Xmx指最大可用内存。可根据服务器的实际承载情况对这两个参数进行设置,如:

Tomcat中å ä¸ªå¸¸ç¨åæ°çéç½®

(5)指定JDK路径动态配置

Tomcat中å ä¸ªå¸¸ç¨åæ°çéç½®

(6)设置session有效时间

修改conf/web.xml配置文件,设置session-timeout的值(单位:分钟),如下图:

Tomcat中å ä¸ªå¸¸ç¨åæ°çéç½®


30.什么是乐观锁?什么是悲观锁?有什么区别?

-悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。格式 SELECT…FOR UPDATE
-乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。格式 SELECT…FOR UPDATE NOWAIT

 

31.读多写少,读少写多, 都用什么锁,列举几种常用的java锁

-读写锁ReentrantReadWriteLock,读写锁表示两个锁,一个是读操作相关的锁,称为共享锁;另一个是写操作相关的锁,称为排他锁。

-读多写少,用共享锁

-读少写多,用排他锁

常用的锁:

(1)独享锁/共享锁
-独享锁是指该锁一次只能被一个线程所持有。 (ReentrantLock、 Synchronized)
-共享锁是指该锁可被多个线程所持有。 (ReadWriteLock)

(2)读写锁 ReentrantReadWriteLock

(3)公平锁/非公平锁
-公平锁是指多个线程按照申请锁的顺序来获取锁。
-非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能会造成饥饿现象。

(4)可重入锁
-可重入锁又名递归锁,是指同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。
-ReentrantLock和Synchronized都是可重入锁。可重入锁的一个好处是可一定程度避免死锁 

(5)乐观锁/悲观锁

(6)分段锁
分段锁是一种锁的设计,并不是一种具体的锁。对于ConcuttentHashMap就是通过分段锁实现高效的并发操作

(7)自旋锁
自旋锁是指尝试获取锁的线程不会阻塞,而是采用循环的方式尝试获取锁。好处是减少上下文切换,缺点是一直占用CPU资源。

 

32,synchronized和ReentrantLock的对比

到现在,看到多线程中,锁定的方式有2种:synchronized和ReentrantLock。两种锁定方式各有优劣,下面简单对比一下:
-synchronized是关键字,就和if...else...一样,是语法层面的实现,因此synchronized获取锁以及释放锁都是Java虚拟机帮助用户完成的;ReentrantLock是类层面的实现,因此锁的获取以及锁的释放都需要用户自己去操作。特别再次提醒,ReentrantLock在lock()完了,一定要手动unlock()
-synchronized简单,简单意味着不灵活,而ReentrantLock的锁机制给用户的使用提供了极大的灵活性。这点在Hashtable和ConcurrentHashMap中体现得淋漓尽致。synchronized一锁就锁整个Hash表,而ConcurrentHashMap则利用ReentrantLock实现了锁分离,锁的知识segment而不是整个Hash表
-synchronized是不公平锁,而ReentrantLock可以指定锁是公平的还是非公平的
-synchronized实现等待/通知机制通知的线程是随机的,ReentrantLock实现等待/通知机制可以有选择性地通知
-和synchronized相比,ReentrantLock提供给用户多种方法用于锁信息的获取,比如可以知道lock是否被当前线程获取、lock被同一个线程调用了几次、lock是否被任意线程获取等等
总结起来,我认为如果只需要锁定简单的方法、简单的代码块,那么考虑使用synchronized,复杂的多线程处理场景下可以考虑使用ReentrantLock。当然这只是建议性地,还是要具体场景具体分析的。

33.Linux的常用命令 scp find-name , 在文件里面查询关键字

https://www.cnblogs.com/gaojun/p/3359355.html

(1)ls命令:通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。

(2)cd命令:(changeDirectory),命令语法:cd [目录名]。说明:切换当前目录至dirName

(3)mkdir命令:创建文件夹命令

(4)rm命令:删除文件命令

(5)mv命令:移动命令

(6)cp命令: 将源文件复制至目标文件,或将多个源文件复制至目标目录。

(7)more命令:more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示
(8)less命令: less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。

(9)tail命令:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。

(10)grep命令:强大的文本搜索命令,grep(Global Regular Expression Print)全局正则表达式搜索

(11)ps命令:ps(process status),用来查看当前运行的进程状态,一次性查看,如果需要动态连续结果使用top


34.如何在linux里面打印java的线程状况

 ps -ef

35.用过哪些消息中间件,rabbitMQ发消息,都涉及哪些参数,exchange topic(主题分发模式) brocker管理

https://blog.csdn.net/leexide/article/details/80035462

消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。


/创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置RabbitMQ相关信息
factory.setHost("localhost");
factory.setUsername("lp");
factory.setPassword("");
factory.setPort(2088);
//创建一个新的连接
Connection connection = factory.newConnection();
//创建一个通道
Channel channel = connection.createChannel();
//声明一个队列        
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
注1:queueDeclare第一个参数表示队列名称、第二个参数为是否持久化(true表示是,队列将在服务器重启时生存)、第三个参数为是否是独占队列(创建者可以使用的私有队列,断开后自动删除)、第四个参数为当所有消费者客户端连接断开时是否自动删除队列、第五个参数为队列的其他参数
String message = "Hello RabbitMQ";
//发送消息到队列中
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
注2:basicPublish第一个参数为交换机名称、第二个参数为队列映射的路由key、第三个参数为消息的其他属性、第四个参数为发送信息的主体
//关闭通道和连接
channel.close();
connection.close();

36.消息中间件模式分类

(1)点对点:PTP点对点:使用queue作为通信载体 

-消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。 
-消息被消费以后,queue中不再存储,所以消息消费者不可能消费到已经被消费的消息。 Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

(2)发布/订阅:Pub/Sub发布订阅(广播):使用topic作为通信载体 

-消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。


37.你的系统如何与第三方系统对接,有哪些对接方式,协议层如何设计

(1)第一种方案:socket方式

-Socket方式是最简单的交互方式。是典型才C/S交互模式。一台客户机,一台服务器,其中传输协议可以是TCP/UDP 协议

(2)第二种方案:ftp/文件共享服务器方式

(3)第三种方案:数据库共享数据方式

(4)第四种方案:message方式

38.rabbitMQ的特点

-可靠性:RabbitMQ使用一些机制来保证可靠性,如持久化、传输确认及发布确认等。
-灵活的路由:在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能,RabbitMQ己经提供了一些内置的交换器来实-现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件机制来实现自己的交换器。
-扩展性:多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。
-高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队仍然可用。
-多种协议:RabbitMQ除了原生支持AMQP协议,还支持STOMP,MQTT等多种消息中间件协议。
-多语言客户端:RabbitMQ几乎支持所有常用语言,比如Jav a、Python、Ruby、PHP、C#、JavaScript等。
-管理界面:RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。
-插件机制:RabbitMQ提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件。

 

39.两个系统之间的调用方式,一个A系统与B系统如何通信?

两个方面,同步调用和异步调用:

-同步调用:最常用的是直接使用HTTP调用

-异步调用:最常用的是消息队列

40.分析Java四种引用包括强引用,软引用,弱引用,虚引用?

(1)强引用:只要引用存在,垃圾回收器永远不会回收。Object obj = new Object();

(2)软引用:非必须引用,内存溢出之前进行回收。软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。

(3)弱引用:第二次垃圾回收时回收。弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。

(4)虚引用:垃圾回收时回收,无法通过引用取到对象值。虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。虚引用主要用于检测对象是否已经从内存中删除。

41.Java的四种引用与GC的回收机制有什么关系?

(1)强引用:如果一个对象可以通过一系列的强引用引用到,那么就说明它是不会被垃圾回收机制(Garbage Collection)回收的。因为垃圾回收是不会回收你正在使用的对象的。

(2)软引用:如果一个对象是软引用,当如果内存空间不足时才会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。

(3)弱引用:也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。

(4)虚引用:在任何时候都可能被垃圾回收器回收。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值