掘友等级
获得徽章 0
#1024一起掘金# 早,准备吃午饭
#每天一个知识点#
可重⼊锁和⾮可重⼊锁
所谓重⼊锁,顾名思义。就是⽀持重新进⼊的锁,也就是说这个锁⽀持⼀个线程对
资源重复加锁。
synchronized关键字就是使⽤的重⼊锁。⽐如说,你在⼀个synchronized实例⽅法
⾥⾯调⽤另⼀个本实例的synchronized实例⽅法,它可以重新进⼊这个锁,不会出
现任何异常。
如果我们⾃⼰在继承AQS实现同步器的时候,没有考虑到占有锁的线程再次获取锁
的场景,可能就会导致线程阻塞,那这个就是⼀个“⾮可重⼊锁”。
ReentrantLock 的中⽂意思就是可重⼊锁。
#每天一个知识点#
在事件处理程序中调用event.preventDefault()或者event.stopPropagation()是非常常见的需求,尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理DOM事件细节。
Vue.js 为 v-on 提供了事件修饰符。修饰符是由点开头的指令后缀来表示的。
修饰符可以连用。
#每天一个知识点# 懒加载的主要原理是将非首屏或非立即可见区域的内容推迟加载,直到用户滚动到相应区域才进行加载。以下是一些常用的懒加载实现方式:
图片懒加载:将网页中的图片设置为占位符(通常是一个占位图),而不是直接加载完整的图片。当用户滚动到图片的可见区域时,再通过 JavaScript 将真实的图片 URL 设置到 src 属性上,实现延迟加载。
无限滚动懒加载:在滚动页面时,动态地加载后续的内容,比如加载更多的文章、评论或产品列表。当用户接近页面底部时,通过 AJAX 请求获取下一批数据,并将其插入到页面中,实现无需分页刷新的加载效果。
#每天一个知识点#
阻塞队列的由来
我们假设⼀种场景,⽣产者⼀直⽣产资源,消费者⼀直消费资源,资源存储在⼀个
缓冲池中,⽣产者将⽣产的资源存进缓冲池中,消费者从缓冲池中拿到资源进⾏消
费,这就是⼤名鼎鼎的⽣产者-消费者模式。
该模式能够简化开发过程,⼀⽅⾯消除了⽣产者类与消费者类之间的代码依赖性,
另⼀⽅⾯将⽣产数据的过程与使⽤数据的过程解耦简化负载。
我们⾃⼰coding实现这个模式的时候,因为需要让多个线程操作共享变量(即资
源),所以很容易引发线程安全问题,造成重复消费和死锁,尤其是⽣产者和消费
者存在多个的情况。另外,当缓冲池空了,我们需要阻塞消费者,唤醒⽣产者;当
缓冲池满了,我们需要阻塞⽣产者,唤醒消费者,这些个等待-唤醒逻辑都需要⾃
⼰实现。(这块不明⽩的同学,可以看最下⽅结语部分的链接)
这么容易出错的事情,JDK当然帮我们做啦,这就是阻塞队列(BlockingQueue),
你只管往⾥⾯存、取就⾏,⽽不⽤担⼼多线程环境下存、取共享变量的线程安全问
题。
#每天一个知识点#
CAS的全称是:⽐较并交换(Compare And Swap)。在CAS中,有这样三个值:
V:要更新的变量(var)
E:预期值(expected)
N:新值(new)
⽐较并交换的过程如下:
判断V是否等于E,如果等于,将V的值设置为N;如果不等,说明已经有其它线程
更新了V,则当前线程放弃更新,什么都不做。
所以这⾥的预期值E本质上指的是“旧值”。
#每天一个知识点#
乐观锁:
乐观锁⼜称为“⽆锁”,顾名思义,它是乐观派。乐观锁总是假设对共享资源的访问
没有冲突,线程可以不停地执⾏,⽆需加锁也⽆需等待。⽽⼀旦多个线程发⽣冲
突,乐观锁通常是使⽤⼀种称为CAS的技术来保证线程执⾏的安全性。
由于⽆锁操作中没有锁的存在,因此不可能出现死锁的情况,也就是说乐观锁天⽣
下一页