1.volatile关键字的底层实现
在并发编程中会遇到三个问题:原子性、可见性、有序性
volatile主要解决了可见性和有序性:当一个共享变量被volatile修饰时,它能保证修改的值立马被更新到内存,当其他线程需要读取变量时,可以到内存中读取。通过禁止指令重排序来实现有序性。
volatile变量原则——对一个变量的写操作优先于对一个变量的读操作。
volatile利用的其实就是内存模型的缓存一致性原则:在内存的变量被修改时,如果它发现该变量是共享变量,在其他cpu有副本,那么其他cpu的副本就会被设置为无效,当其他cpu读取变量时发现无效就会去读取内存中的变量。
在使用volatile关键字时,会多出一个lock前缀指令:相当于一个内存栅栏:
lock前缀指令使用volatile要注意两个情况:对变量的写操作不依赖当前值;变量没有包含在其他变量的不定式中
2.快排以及时间复杂度
快速排序:找到一个基准数,左边的数都比它小,右边的数都比它大。两个指针,一个从前往后(i)一个从后往前(j),从后往前(j)的先走,当j找到了一个比基准数小的数,就停下,然后让i移动直到找到基准数大的数,然后交换i和j位置上的数,最后将j和i相等位置上的数和基准数相换
3.java中线程如何交互?
线程交互4.java中的锁机制
独享锁/共享锁:独享锁就是该锁一次只能被一个线程所拥有;共享锁是该锁可被多个线程所持有。
公平锁/非公平锁:公平锁是指多个线程按照申请锁的顺序来获取锁;非公平锁就是获取锁的顺序并不是按照申请锁的顺序,有可能是后申请的线程比先申请的线程优先获取锁(可能会造成饥饿现象)
可重入锁:同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取(避免死锁)
乐观锁/悲观锁:乐观锁认为不存在很多的并发更新操作,不需要加锁,数据库中乐观锁的实现一般采用版本号,java中可使用CAS实现乐观锁。悲观锁认为存在很多并发更新操作,采取加锁操作,如果不加锁一定会出现问题。
分段锁:分段锁是一种锁的设计,ConcurrentHashMap就是通过分段锁来实现高效的并发操作。
自旋锁:尝试获取锁的线程不会阻塞,而是采用循环的方式尝试获取锁。好处是减少上下文切换,缺点是一直占用CPU资源。
偏向锁/轻量级锁/重量级锁:不断升级
偏向锁/轻量级锁/重量级锁5.悲观锁和乐观锁,mysql中怎么实现?java中怎么实现?
MySql通过版本号来实现乐观锁,select......for update来实现悲观锁
java通过CAS来实现乐观锁,synchronized实现悲观锁
6.长连接和短连接
8.泛型
9.常见的异常类
10.单例模式(线程安全、双重检查)
11.Spring了解
SpringBoot和Spring的区别:
12.常见的排序算法
14.同步的控制方法
15.integer和int的区别
16.重写和重载的区别
17.HashMap和HashTable的区别
HashMap和TreeMap的区别:
HashMap和LinkedHashMap的区别:
LinkedHashMap通过双向链表实现有序的HashMap
HashMap和ConCurrentMap的区别:
18.抽象类和接口的区别
19.数据库索引
20.java lock的实现,公平锁,非公平锁
看第4点
21.常见的设计模式
22.多线程中断的原理
23.B+,B-,红黑树,二叉搜索树,平衡搜索树
还没有看。。。
24.线程池
25.优化sql
索引,视图
26.ACID,隔离级别
27.JVM类加载机制
28.JVM分区
29.GC算法
30.垃圾收集器
31.collections
看HashMap和HashTable那块
32.创建线程的方法
网友评论