妙博客

主机评测 香港服务器 洛杉矶VPS测评

ThreadLocal的用法和原理

ThreadLocal是与一个线程绑定的本地变量,也就意味着这个变量是线程独有的,是不能与其他线程共享的。这样就可以避免资源竞争带来的多线程的问题。ThreadLocal是每个线程都有一个资源副本,是不需要加锁的。一般应用在线程间数据隔离的情况,比如数据库连接池

java中volatile关键字的作用

这个关键字主要是保证了对其它线程的可见性和代码执行的有序性可见性:当一个变量被定义为Volatile类型时,任何对它的修改都会立即刷新到主内存中,而不是等到线程结束或者锁被释放。同时,当其他线程需要访问这个变量时,它们会从主内存中读取最新的值。这样就保证了线程间数据的一致性。有序性:防止指令重排序内存屏障(memorybarrier)是一个CPU指令,这条指令可以确保一些特定指令的执行顺序。插入一个内存屏障,相当于告诉CPU和编译器先于这个命令的必须先执行,后于这个命令的必须后执行。内存屏障另一

如何保证消费的幂等性

利用token机制服务器把客户端传过来的token进行验证,redis通过setnx命令,如果设置失败说明token已经存在,是一个重复请求。

MQ如何保证消息消费的顺序性

RocketMQ为例1.生产者把顺序消息添加到同一个队列。rocketMq在send方法可以自定义一个消息队列选择器,可根据传入的订单号,选择哪个队列。@Test public void orderlyProducer() throws Exception {     List<MsgModel> msgModels = new ArrayList()

MQ怎么保证消息不丢失和重复消费

防止消息丢失:生产者默认重试次数为2producer.setRetryTimesWhenSendFailed(3);消费者默认重试次数为无限次consumer.setMaxReconsumeTimes(5);防止重复消息:1.生产者发送的消息中,带一个业务唯一标识public void keyProducer() throws Exception{     DefaultMQProducer produc

mysql索引失效的场景

1.对索引使用左模糊匹配或者左右同时模糊匹配时(B+树(多路平衡查找树)的特性决定)2.对索引使用函数(因为索引保存的是索引字段的值,而不是经过函数计算后的值)3.对索引表达式进行计算(比如where id + 1 = 10,改成 where id = 10 - 1可以)4.对索引进行隐式类型转换(如果索引字段是字符串类型,但是条件是整型的话就会做全表扫描)5.联合搜索引没使用最左匹配原则假设(a,b,c)联合索引,如果条件是where a=1或者a=1 and b=2或者a=1 and b=2

redis怎么保证和mysql数据一致

方案一:基本思路:在写库前后都进行redis.del(key)操作1、先删除缓存2、再写数据库4、延迟一段时间再次删除缓存方案二:先更新数据库,再删除缓存。并配合消息队列来重试缓存的删除,或者用阿里 Canal 中间件订阅 MySQL binlog 删除缓存。

Spring MVC工作流程?

Spring MVC是一种基于(Model-View-Controller)模式的Web框架,它的工作流程主要包括以下几个步骤:  1.首先前端管理器DispatcherServlet接收到用户请求,将请求转发给对应的处理器映射HandlerMapping。 2.HandlerMapping根据URL调用对应的处理器适配类HandlerAdaptor从而找到具体的Controller。 3.Controller层接受到用户参数后,会把请求参数传递给Controller里面的方法。Con

java线程同步的理解synchronized和Lock

1.synchronized是关键字,Lock是接口;2.synchronized是隐式的加锁,lock是显式的加锁;synchronized在退出代码块时自动解锁,lock却必须调用unlock方法进行手动释放3.synchronized可以作用于方法上,lock只能作用于方法块;4.synchronized底层采用的是objectMonitor,lock采用的AQS;5.synchronized是阻塞式加锁,lock是非阻塞式加锁支持可中断式加锁,支持超时时间的加锁;6.synchroniz

谈谈java中对JVM的理解

JVM也叫java虚拟机,特点是它的跨平台性,Java语言使用Java虚拟机屏蔽了与具体平台相关的信息。Java虚拟机在运行Java程序时,会管理着一块内存区域,JVM内存模型可分为五个部分:堆区、方法区、虚拟机栈、本地方法栈、程序计数器1.堆:该内存区域是jvm虚拟机管理的内存中最大的一块内存,它存放了对象实例及数组2.方法区:是各个线程共享的内存区域,用于已被虚拟机加载的类型信息、常量、静态变量、编译器代码缓存等3.虚拟机栈:它保存方法的局部变量、方法返回地址和一些额外的附加信息4.本地方法

Copyright Your 142132.com Rights Reserved. 赣ICP备17010829号-2