随笔分类 - 面试
摘要:光谈论方式的话,太多了,数据库、jvm内存、redis、zookeeper都可以,最常用的是基于redis实现的redission框架 核心原理众多博客讲的很清楚,面试说个大概应该没问题了 第一点,用的reids的setex命令,因为这个命令是原子操作,不会在设置锁的过程中出现意外 第二点,锁过期问
阅读全文
摘要:使用同一把锁的同步代码块分布在两个方法,或者地方,其中一个一个方法调用另一个同步方法不会被阻塞
阅读全文
摘要:拿rabbitmq举例吧 它有两种方案,一个是开启事务,但这种会降低性能; 还有种异步confirm机制,在生产者这边,mq消息成功消费后会有一个异步回调,所以通常会用这个模式。 光做这个常规情况下够了,如果考虑宕机,还有其他极端情况,要开启持久化,和使用数据库记录消息流水。 另外mq自动的ack只
阅读全文
摘要:用法: synchronized修饰代码块或者方法,不需要手动释放,默认非公平 ReentrantLock需要手动调用,手动释放,能够控制公平机制,能够尝试获取和超时获取锁,能更好的控制锁行为,在需要通过线程提高性能的场景中,能比较好的操控 基本原理: synchronized是靠管程(monito
阅读全文
摘要:这种问题的话,肯定是要提前设置好缓存的 第二要有相对严格的双写一致策略,只要数据库数据发生变化,就要主动更新缓存,可以用binlog,代码层面可以用读写锁限制写的请求 第三要使用定时任务固定刷新 第四要有判空操作,一般的缓存使用,如果不存在的key,可能会前往db进行查询,可以打破这一规则,至于用什
阅读全文
摘要:常见操作系统的线程状态是五种 创建 --> 就绪 --> 运行 -> 阻塞 --> 终止 java中定义了六中,主要是依据锁的行为 create --> runnable --> waiting --> time_waiting --> blocked --> terminate java中的run
阅读全文
摘要:为什么不推荐stop 主要它不释放锁资源,尤其暴力终止,可能会导致业务执行到一半,出现各种问题。 为什么使用interrupt方法 通常使用自带的方法,而不是使用自定义的业务标识,是因为interrupt能修改线程状态,java线程的终止,需要从runnable终止。如果仅仅使用自定义的终止标志,有
阅读全文
摘要:1、默认是RDB方式,就是每隔1秒钟,直接把数据持久化到磁盘,数据量大的时候,可能就会卡顿,但是这种持久化实际上是异步的,但是也不能完全依赖系统性能 2、AOF记录命令的方式,这种在启动的时候可能导致cpu飙升 3、混合方式,在RDB的时候,有新数据进来就采用AOF方式记录 需要去调整nginx配置
阅读全文
摘要:问这种东西其实也算纯八股文了 数据库处理并发事务的普遍参考或者协议吧 及其类似 java 的读写锁 假设现在有多个请求并发来到数据库,请求如下:读、读、读、写、读、读、写、写、读、读 1、读-读:这个不存在任何问题 2、读-写:写会阻塞读 3、写-写:写也会阻塞写 4、写-读:读不会阻塞写 查询bi
阅读全文
摘要:1、最常用用来当缓存使用,最常见缓存的是用户数据,毕竟基于spring security开发的话,默认的用户缓存方式就是直接jvm内存和外部缓存两种 2、有些签到、排行榜功能会用, 签到使用位图,因为用户数据量极大的时候用数据库记录存不太合适,签到数据也是几何倍数增长,但是其实数据库也能实现这种位图
阅读全文
摘要:1、先使用一些集成测试插件(比如jmeter、metershpere)或者脚本定位到慢速接口,也可以通过日志分析cat | grep 2、使用sonar、findbugs之类的插件定位复杂度较高的代码,(分析一下算法复杂度和空间复杂度)以及sql调用部分的代码 3、先将调用的sql放到mysql上运
阅读全文
摘要:和udp的区别 定义上来说,tcp是面向连接的、安全的、可靠的协议;udp是面向数据报的、不可靠的协议。 从本质上来说,就是tcp每次建立和断开连接,都要进行握手和挥手,客户端每次传送数据包,都会收到服务端的ack确认,还有报文缺失、超时的重传机制。 udp是没有这些握手和确认机制的,所以udp不保
阅读全文
摘要:1、现在多数项目都是前后端分离,nginx代理静态资源的性能比tomcat之类的服务器要好 2、如果存在多实例的服务,nginx可以充当代理,进行负载均衡(轮询、ip_hash、最少连接数之类的) 3、如果静态网页需要调用多个服务,nginx可以设置多个代理服务且不会造成跨域
阅读全文
摘要:说实话,如果问这种问题,有点纯八股文面试的感觉了,因为原理完全不是java语言实现的,知道了也没什么用 首先得知道标量替换和逃逸分析,以及垃圾回收发生阶段 标量替换是需要开启的(jdk1.7之后标量替换和逃逸分析是自动开启),就是把一个对象分割成不可替换的基本类型,基本类型都在栈上创建,替换条件没深
阅读全文
摘要:1、使用Thread或其子类 2、实现Raunnable接口 3、实现Callable接口,它初始化时接收一个Feature对象 启动线程的方式一般两种,直接调用start(不推荐业务中使用,除非能很确定的预判创建数量),或者丢到线程池中
阅读全文
摘要:IoC控制反转,指spring有一个容器,帮助我们创建和管理bean的生命周期,不需要显示的进行new和编写控制这个bean状态的代码,效果就是很好地解耦了一些业务逻辑上的关联性。 DI依赖注入,其实和控制反转描述的是同一件事,只是从另一个角度上的描述,spring帮助我们管理bean之后,我们就可
阅读全文
摘要:1、面试官问,有没有什么方式线程执行完了主动通知主线程或者另一个线程? 观察者模式 java和spring配合,通过父子继承的方式还能实现一种奇怪的通知,关键点就是@PostConstruct这个注解,那么父类和子类都有注入spring容器的注解的话,父类中调用的方法也会触发子类调用 2、常用的设计
阅读全文
摘要:简单优化: 1、不要使用 select *,尽量避免回表查询 2、尽量避免 in语句,用exist语句代替 3、如果 like 语句前后模糊匹配导致索引失效,可以使用 SELECT * FROM table WHERE INSTR(name, 'keyword') > 0; 4、优先在where 、
阅读全文