请你说说Redis的数据类型中的zset,它和set有什么区别?底层是怎么实现的?
zset
:有序不可重复,底层数据结构ziplist
(压缩链表)和skiplist
(跳表),有序主要多了一个维度,score
分数,根据score
字段排序,元素个数小于128
,所有元素长度小于64
字节,就使用ziplist
,否则就是用skiplist
,有索引的列表
set
:无序不可重复,底层数据结构整数集合inset
和hashtable
说说static修饰符的用法
一个类包含变量、方法、构造方法、代码块、内部类,注意static
不能修饰构造方法,其余都可以修饰;类加载完毕,即使没有创建对象也可以使用static
修饰的部分,注意静态方法不能使用this
,this
属于实例,需要创建对象后才能使用,静态优先对象存在
说说线程的状态
有六种状态:
- 新建(
new
):线程被创建但未调用start
方法 - 运行(
runnable
):这个状态分为两种,就绪和运行,就绪还在等分配CPU
时间片,运行得到CPU
时间片执行任务 - 阻塞(
blocked
):线程执行同步代码时,需要获取锁,但此时锁已经被其他线程获取,需要等待锁的释放 - 等待(
waiting
):线程需要等待其他线程唤醒 - 有限等待(
timed waiting
):有限等待,到达一定时间自动醒来 - 终结(
terminated
):线程执行完run
方法,或者异常后退出run
方法
说说你对ThreadLocal的理解
线程变量,用来隔离多线程下的共享变量,保证变量线程安全,即每个线程拥有资源副本
实现原理:每个ThreadLocal
都有一个内部类ThreadLocalMap
,它能存储键值对信息,set
方法首先根据当前线程获取ThreadLocalMap
(返回thread.threadLocals
),然后以ThreadLocal
对象本身作为key
,值为变量副本存入ThreadLocalMap
,get
的也是首先根据当前线程获取ThreadLocalMap
,以ThreadLocal
对象本身作为key
获取变量副本,ThreadLocal
使用完需要删除,否则会出现内存泄露问题,因为线程一直不销毁,变量副本一直存在
public class Thread{
ThreadLocal.ThreadLocalMap threadLocals = null;
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
说说SpringBoot常用的注解
@SpringBootApplication:启动类上面的注解,包含@EnableAutoConfiguration、@SpringBootConfiguration、@CompetentScan
@RestController
@RequestMapping
@Autowire
@Qualifier:和@Autowire一起使用,指定bean的名称
@Value
@PostMapping
@GetMapping
@PutMapping
@DeleteMapping
@RequestBody
@PathVariable
@RequestParam
@Mapper
@Service
@Bean
@Competent
@Configuration
说说bean的生命周期
创建、初始化、调用、销毁
创建bean
:有三种方法
- 构造函数,通过反射调用构造函数
- 静态工厂
- 实例工厂
自定义初始化方法:编写一个初始化方法,在方法上添加@PostConstruct
注解
自定义销毁方法:编写一个销毁方法,在方法上添加@PreDestroy
注解
synchronize和lock有什么区别
synchronize
:关键字;作用在静态方法、普通方法、代码块;代码执行完或异常自动释放锁;获取不到锁一直等待
lock
:接口;只能作用在代码块;需要在finally
手动释放锁;可以设置获取锁的超时时间