![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java面试基础
文章平均质量分 69
dyjs.akcnzssa.s.
这个作者很懒,什么都没留下…
展开
-
悲观锁和乐观锁
这里因为是库存,即时数据变化了,也无所谓,优化为stock>0就可以了,所以即时数据在此期间被修改了,我们也可以修改。当读取数据时,会将当前的版本号一同读出;在更新数据时,会对版本号加一,并将其与数据库表对应记录的当前版本信息进行比较.(set version=version+1 where version=1)悲观锁:比较悲观,认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。这里以stock(库存)为例,先查询库存数,在修改的时候判断库存数是否和之前查询到的一致,一致就修改。原创 2024-03-08 20:11:23 · 180 阅读 · 0 评论 -
静态代理,jdk动态代理,cglib动态代理
代理模式就是用代理对象代替真实对象去完成相应的操作,并且能够在操作执行的前后对操作进行增强处理。原创 2024-03-26 20:32:03 · 283 阅读 · 0 评论 -
ThreadLocal
1.ThreadLocal是Java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据。使用场景:实现登陆功能,使用登陆凭证token获取用户的信息,获取到的基本信息存入ThreadLocal中以供线程后续功能使用。原创 2024-03-23 18:04:26 · 112 阅读 · 0 评论 -
synchronized和lock的区别
假设,线程5去获取一把锁时,线程1刚好释放锁,这时线程5就能直接插队,线程5获取不到锁,才会进入等待队列。synchronized 是java的一个关键字,源码在 jvm 中,用 c++ 语言实现,synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁。Lock 是接口,源码由 jdk 提供,用 java 语言实现,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生。公平锁:多个线程去请求锁时,会按照请求锁的顺序去一一获取锁(线程会按顺序进入队列,队头线程获取锁)原创 2024-03-23 17:29:29 · 356 阅读 · 0 评论 -
线程池相关知识
(即使线程池中有空闲着的线程)1.当线程池中的线程数量核心线程数量,并且某一条空闲线程的空闲时间超过一定时间,就会把这条线程当做临时线程回收。3.当线程池中线程数量>=核心线程数量,并且缓存队列也被存满时,再添加的任务,会创建空闲线程(临时工)来处理新任务。2.当线程池中的线程数量=核心线程数量时(线程池无空闲),每添加一个任务就把这个任务放入缓存队列。原创 2024-03-23 15:17:08 · 419 阅读 · 0 评论 -
JAVA并发编程
该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权(还没获取),此时处于就绪状态(ready)。Waiting(等待):获取锁成功后,线程可能需要等待其他线程完成某个任务后才能继续执行。当其他线程完成某个任务时,可以锁.notify()随机唤醒一个等待队列中的线程,但不会释放锁,防止其他线程对本线程造成干扰。(该线程会进入阻塞状态)等待获取锁成功的线程释放锁时会唤醒阻塞状态的线程,让他们重新争抢锁,争抢成功进入可运行状态。当线程对象的调用start()方法时,该线程就进入了可运行状态。原创 2024-03-21 19:44:29 · 259 阅读 · 0 评论 -
fail-fast和fail-safe
fail-safe: CopyOnWriteArrayList 是 典型代表,遍历的同时可以修改,原理是读写分离,但会牺牲一致性(读的是旧数据,但其实数据已经更新了)出现了并发修改异常,原理是底层的一个modCount属性,记录当前这个ArrayList被修改过的次数,通过迭代器遍历的过程中,次数不一致就会报错。CopyOnWriteArrayList:原理是写入的数组和读的数组不是一个数组,读的是旧数组,写的是新数组。fail-fast:ArrayList 是典型代表,遍历的同时不能修改,尽快失败。原创 2024-03-21 16:30:37 · 112 阅读 · 0 评论