1、java有哪些类加载器?
启动类(Bootstrap)加载器 BootClassPathHolder: 加载
扩展类(Extension)加载器ExtClassLoader:加载
系统类(System)加载器AppClassLoader:加载我们自己项目中写的java文件编译而成的class文件,位于target/classes下
2、int和Integer有什么区别?
Integer是int的包装类,int则是java的一种基本数据类型,Integer的默认值是null,int的默认值是0;
JavaBean中我们应尽量使用Integer,打个比方,学生成绩如果用int,缺考怎么表示,0?那考0分的呢;-1?也可以,但没有null直观;
3、你在项目中如何保证缓存和数据库的一致性?
只要有引入缓存的地方,都不可能保证强一致性,所以这里的一致性是指最终一致性。
方法很多,最常用的就是延时双删,先删除缓存,再操作数据库,完事儿再删除一次缓存。
第二次删除缓存是为了避免 在第一次删除缓存之后,到操作数据库完成之前,这期间有新的查询过来,导致再次把旧数据生成缓存
4、mysql中char和varchar有什么区别?
char长度固定,最大长度255,实际长度小于设置长度时用空格补齐,举个栗子,char(5),如果你实际存的字符串是"abc",那么mysql在存储时会在abc后面加两个空格来补齐,即"a b c _ _",在你拿数据时,这两个空格又会被抹去,你得到的数据依然是abc三个字符;适合用来存身份证号、手机号等固定长度的数据;
varchar长度不固定,设置的长度是指最大长度,最大65535,存多少就是多少,如varchar(100),只要长度小于100的字符串都能存进去,字符串多长就用多长,不会追加空格;
5、java里Integer的最大值是多少?最大值+1等于多少?
最大值是2的31次方-1,即2147483647,最大值+1等于-2147483648
6、关于mybatis的缓存机制
mybatis有一级缓存和二级缓存
一级缓存作用于单个session,默认开启,无需手动使用;
二级缓存作用于整个mapper,默认开启,但需要手动使用;
如何使用二级缓存:在你的*Mapper.xml文件中添加cache标签即可。
7、导致线程阻塞的原因有哪些?
主动调用Thread.sleep(1000)方法:暂时放弃对cpu的使用,不会释放锁,睡眠时间到了后直接进入就绪态,拿到cpu时间片立即执行;
主动调用Thread.yield()方法:向调度系统表明当前线程愿意放弃其对处理器的使用;
遇到Object类的wait()方法:放弃当前持有的锁,进入等待状态,直到有其他线程将其唤醒;
遇到Thread类的join()方法:当线程t调用在当前线程内部调用join时,当前线程会陷入阻塞,直到线程t执行完;
cpu时间片用完:线程调度是由操作系统控制,同一个系统里面线程那么多,cpu不可能只执行这一个线程,所以每个线程在执行前都需要先拿到cpu时间片,用完后进入就绪态,再次拿到时间片即可开始执行。