说说volatile的用法及原理
用法:保证变量的可见性,有序性,不能保证原子性,保证单个变量的线程安全,可见性即某个线程修改变量后,其他线程第一时间得到新数据,有序性是执行顺序和代码顺序一致,防止指令重排,即还未赋值就使用
原理:每次写的使用,都是先刷新主内存,读的时候先读主内存,而不是使用缓存;volatile
使用内存屏障防止指令重排,内存屏障即只能按照某个方向执行
如何实现Redis高可用
高可用即主节点宕机后,需要进行故障转移,选举从节点作为新的主节点,可以通过sentinel
哨兵集群来实现该功能
哨兵集群原理:心跳检测,默认每隔1
秒给节点发送请求,如果没有接收到节点的回应,则主观判断该节点宕机,防止因为网络导致无法接收到回应,所以如果超过一半sentinel
主观判断该节点宕机,则是客观判断宕机,真的宕机,此时需要进行故障转移;数据之间的同步,此时需要分片集群,把主节点槽分配到新主节点的槽中
请你说一下final关键字
可以作用于类、方法、变量上面
类:类不可被继承
方法:方法不可被重写
变量:变量进行过一次初始化,就不能进行第二次赋值,引用不可变,但其内部内容可变
请你说说重载和重写的区别,构造方法能不能重写
重载:发生在一个类当中,多个方法名相同,参数列表,个数,顺序,类型不同,返回值类型可同可不同
重写:发生在父类和子类当中,子类重写父类方法,方法名、参数和父类相同,访问修饰符比父类大,抛出异常比父类小或相等,返回值类型比父类小或相等
构造方法不能被重写,因为构造方法必须和类名相同,如果重写父类构造方法,会违反这个定义
说说你对Java集合的了解
主要由两个接口collection
和map
接口派生出来的,collection
接口派生出list
、set
和queue
,所有集合类都是这四个list
、set
、queue
、map
接口的实现类
list
:有序可重复,常见有ArrayList
、LinkedList
、Vector
set
:无需不可重复,常见有HashSet
queue
:先进先出队列,常见有PriorityQueue
map
:存储键值对,具有映射关系的元素,常见有HashMap
、HashTable
、ConcurrentHashMap