Java基础之十年面试杂记

4.newSingleThreadExecutor 创建一个单线程化的线程池 只有一个核心线程 以无界队列方式来执行该线程,这使得这些任务之间不需要处理线程同步的问题,它确保所有的任务都在同一个线程中按顺序中执行,并且可以在任意给定的时间不会有多个线程是活动的。

Springsecurity中用一个方法一步就可以将自定义的过滤器引入:

只需要实现attemptAuthentication方法即可

Jdk1.8后出现的迭代器:

Spliterator:java1.8引入的一种并行遍历机制

Rabbitmq死信队列:(当消息成为死信后 可以被重新发布到另一个交换机(exchange)这个交换机就是死信队列)

消息变成死信的情况:

消息被拒绝(basic.reject / basic.nack),并且requeue = false

消息TTL过期

队列达到最大长度

死信处理过程

  1. DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性。

  2. 当这个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进而被路由到另一个队列。

  3. 可以监听这个队列中的消息做相应的处理。

Freemarker缓存是怎么处理的:


FreeMarker 的缓存处理主要用于模版文件的缓存,一般来讲,模版文件改动不会很频繁,在一个流量非常大的网站中,如果频繁的读取模版文件对系统的负担还是很重的,因此 FreeMarker 通过将模版文件的内容进行缓存,来降低模版文件读取的频次,降低系统的负载。

当处理某个模版时,FreeMarker直接从缓存中返回对应的 Template 对象,并有一个默认的机制来保证该模版对象是跟模版文件同步的。如果使用的时候 FreemarkerServlet 时,有一个配置项template_update_delay用来指定更新模版文件的间隔时间,相当于多长时间检测一下是否有必要重新加载模版文件,0 表示每次都重新加载,否则为多少毫秒钟检测一下模版是否更改。

FreeMarker定义了一个统一的缓存处理接口CacheStorage,默认的实现是 MruCacheStorage 最近最少使用的缓存策略。一般情况下,很少需要对缓存进行扩展处理。您可以通过下面的代码指定最大缓存的模版数:

1 cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250))

其中第一个参数是最大的强引用对象数,第二个为最大的弱引用对象数。这两个值FreeMarker默认的是0和 Integer.MAX_VALUE,表明模版缓存数是无限的。

当业务执行中 消费方去下载文件过程失败了怎么办 比如我手动在GridFS把文件删了,前端已经收到生产方成功得消息了


解决:

ACK机制:

由于通信过程的不可靠性,传输的数据不可避免的会出现丢失、延迟、错误、重复等各种状况,TCP协议为解决这些问题设计了一系列机制。这个机制的核心,就是发送方向接收方发送数据后,接收方要向发送方发送ACK(回执信息)。如果发送方没接收到正确的ACK,就会重新发送数据直到接收到正确ACK为止。比如:发送方发送的数据序号是seq,那么接收方会发送seq + 1作为ACK,这样发送方就知道接下来要发送序号为seq + 1的数据给接收方了 如下图:

在这里插入图片描述

应用场景:

(1)数据丢失或延迟。发送方发送数据seq时会起一个定时器,如果在指定时间内没有接收到ACK seq + 1,就把数据seq再发一次。

(2)数据乱序。接收方上一个收到的正确数据是seq + 4,它返回seq + 5作为ACK。这时候它收到了seq + 7,因为顺序错了,所以接收方会再次返回seq + 5给发送方。

(3)数据错误。每一个TCP数据都会带着数据的校验和。接收方收到数据seq + 3以后会先对校验和进行验证。如果结果不对,则发送ACK seq + 3,让发送方重新发送数据。

(4)数据重复。接收方直接丢弃重复的数据即可。

懒汉模式和饿汉模式的区别


懒汉模式:在类加载的时候不被初始化。

饿汉模式:在类加载时就完成了初始化,但是加载比较慢,获取对象比较快。

饿汉模式是线程安全的,在类创建好一个静态对象提供给系统使用,懒汉模式在创建对象时不加上synchronized,会导致对象的访问不是线程安全的

多线程下如何实现单例模式:

由上可知 饿汉模式 类加载时就完成初始化 提前创建好实例 影响加载效率 线程安全

懒汉模式则 类加载时不需要提前创建好实例,加载效率较快,需要安全处理,否则线程不安全

懒汉模式安全处理方案:

(1)在方法区上加锁 但是运行效率低下 下一个线程调用同步方法必须等待上一个释放锁执行完毕

在这里插入图片描述

(2)同步代码快加锁 但是将全部代码锁上了 所以跟上面一样 效率低下

在这里插入图片描述

(3)在需要同步执行的代码块加锁,不影响执行效率且线程安全。

在这里插入图片描述

&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值