面经来源:牛客网
1.谈一谈高并发,说一下ReentrantLock的应用场景,什么时候用CAS,你是如何使用高并发的 ,说一下volatile,应用场景是什么
高并发
随着用户量的增加,一个系统有可能会产生高并发的问题。高并发简单的来说就是在同一时刻很多用户访问同一资源的问题,专业一点的说法就是在同一时刻有很多个线程访问了同一个数据资源。
ReentrantLock应用场景
- 需要进行互斥访问的代码块中。
- 读多写少的场景可以使用ReentrantLock的读写锁。
- 等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,相对于Synchronized来说可以避免出现死锁的情况。通过lock.lockInterruptibly()来实现这个机制。
- 公平锁,同步队列队首出队保证公平。
- 一把锁可以绑定多个条件,一个ReentrantLock对象可以同时绑定多个Condition。ReenTrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
什么时候使用CAS
-
当要修改的变量是volatile修饰的属性是
-
最好不是CPU密集型任务时
-
读多写少
volatile
volatile修饰的变量,访问它的时候需要从主内存获取,对它的修改必须同步刷新至主内存,保证了对所有线程的可见性。
会在对volatile修饰的变量前后插入内存屏障,禁止指令重排序。例如对普通变量的初始化操作,原本应该是先分配内存,然后初始化对象,再将引用指向该内存。但是在cpu优化下,可能会被重排序为先分配内存,然后将引用指向该内存,再初始化对象。而有了volatile修饰后,该重排序会被禁止,可用于双重检测单例模式。
2.数据库的事务,四个隔离级别,可重复读为什么会产生幻读,怎么解决
事务 就是保证一个或多个对数据库的操作具有原子性、隔离性、一致性、持久性的。
四个隔离级别:
读未提交: 最低级别的隔离,能够读到其他事务还未提交的脏数据。
读已提交: 只能读到其他事务提交后的数据,事务1先读到A
为a
,这时候事务2修改A
为b
并提交了事务,事务1再读A
发现变成了b
,导致一个事务中不可重复读数据。
可重复读: 事务1中对同一数据的两次读取,结果始终相同。但是可能会有幻读产生,即同一个查询读到之前未读到的数据。在Mysql
中利用MVCC
解决了快照读幻读
,利用间隙锁
解