AOP(面对切面编程)
IOC(控制反转):
优点
缺点
认识:缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案:
认识:缓存雪崩,即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。
解决方案:
认识:缓存一致性:保证关系型数据库与非关系型数据库数据一致。
解决方案:
方案1:
查询时先去 redis 中判断数据是否存在,如果存在,则直接返回缓存好的数据。而如果不存在的话,就会去数据库中读取数据,并把数据缓存到 Redis 中
增删改时,先更新库,再让缓存失效(推荐做法,仍可能产生数据不一致)
增删改时,先让缓存失效,再更新库(错误做法,很容易数据不一致)可以给缓存数据加入过期时间,或采用延时双删解决。
方案2:使用 canal 根据 mysql binlog 将数据同步至 redis,客户端代码不需要更新缓存,只做查询缓存操作。
每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个 int 变量(从 1-10),1 代表最低优先级,10 代表最高优先级。
java 的线程优先级调度会委托给操作系统去处理,所以与具体的操作系统优先级有关,如非特别需要,一般无需设置线程优先级。
方法归属
sleep(long) 是 Thread 的静态方法,而 wait(),wait(long) 以及 wait(long int) 都是 Object 的成员方法,每个对象都有。
醒来特性
执行 sleep(long) 和 wait(long) 的线程都会在等待相应毫秒后醒来; wait(long) 除了睡足自己醒之外还可以被 notify 唤醒,wait() 只能被 notify 唤醒。
锁特性
wait(long) 和 sleep(long) 的效果都是让当前线程暂时放弃 CPU 的使用权,进入有时限等待状态 TIMED_WAITING; wait 方法的调用必须先获取 wait 对象的锁(代码片段1),而 sleep 则无此限制; wait 方法执行后会释放对象锁,允许其它线程获得该对象锁,而 sleep 如果在 synchronized 代码块中执行,并不会释放对象锁(代码片段2)。
代码片段1
final Object lock = new Object();synchronized (lock) {try {// 不在 synchronized 内调用 wait 会抛出 IllegalMonitorStateException 异常lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); }}
代码片段2
final Object lock = new Object();synchronized (lock) {try {// 在 sleep 期间其它线程可以获得 cpu 的使用权,但无法进入 lock 锁对应的同步代码块 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }}
之后聊了聊相关的职业规划,这里大家需要注意的是,无论是往哪个方向发展都要有相关的一个证明,大谈特谈很空洞的,而这一点也可以结合对公司的了解来定义自己的规划。
面试到现在不得不感叹,的确有公司就是这样不聊什么问题或者只是聊一些基础的问题就顺利那些offer了。不过我还是相信,有备无患,多准备点总是好的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。