目录
4、对于“try-catch-finally”,若try语句块中包含“return”语句,finally语句块会执行吗?
1、BeanUtils.copyProperties()
通过反射将一个对象的值赋给另一个对象(前提是对象中属性的名字相同)。BeanUtils.copyProperties(queryResultPage, pageResultVo);即copyProperties(Object source, Object target)将给定源source bean的属性值复制到目标target bean中。
2、死锁的4个必要条件
资源互斥:资源在同一时刻只能被一个进程使用;
请求保持:一个进程因请求资源而阻塞时,对已获得的资源保持不释放;
不可剥夺:进程已获得的资源,在末使用完之前,不能强行剥夺(只能是主动释放);
循环等待:多个线程相互等待对方释放资源(a拿b的,b拿c的,c拿a的;循环等待)。
互斥条件是资源使用的固有特性,无法改变,不做讨论;
破坏请求与保持条件:
一个进程不能获得所需要的全部资源时便处于等待状态,等待期间它占有的资源将被隐式的释放重新加入到系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。
破坏循环与等待条件:
3、项目中如何保证缓存和数据库的一致性?
只要有引入缓存的地方,都不可能保证强一致性,所以这里的一致性是指最终一致性;最常用的就是延时双删,先删除缓存,再操作数据库,完事儿再删除一次缓存;第二次删除缓存是为了避免 在第一次删除缓存之后,到操作数据库完成之前,这期间有新的查询过来,导致再次把旧数据生成缓存;(a线程过来改数据库,进入方法删掉缓存,进行数据更改,这时候,b线程过来查数据,结果发现缓存中没有,就去查数据库,将还没有update完成的"旧数据"放了一份到缓存中;当a线程改完数据,退出方法之前再删一次缓存;这时候c线程过来查询,发现缓存中没有就去数据库查,这个时候查询到的数据就是被修改后的"新数据")。
4、对于“try-catch-finally”,若try语句块中包含“return”语句,finally语句块会执行吗?
会!fianlly总是会在return前执行,若fianlly中有return则try中的return不会被执行;只有当try语句块中有System.exit();或JVM“崩溃”了才不会执行finally中的代码;
5、Java中的异常体系
我们可以看到Throwable类是异常层级中的基类。Error类表示内部错误,这类错误是我们无法控制的;Exception表示异常,RuntimeException及其子类属于未检查异常,这类异常包括ArrayIndexOutOfBoundsException、NullPointerException等,我们应该通过条件判断等方式语句避免未检查异常的发生。IOException及其子类属于已检查异常,编译器会检查我们是否为所有可能抛出的已检查异常提供了异常处理器,若没有则会报错。对于未检查异常,我们无需捕获(当然Java也允许我们捕获,但我们应该做的事避免未检查异常的发生)。
6、生成时间id
//申请号(订单号)
public static String createApplyNo(String reportKey){
//日期时间+报告类型+6为随机数 20201215002273836
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String nowTimeStr = sdf.format(new Date());
String reportId = ParamContants.ReportKey.getReportNumber(reportKey);
String sixRandomNumber = RandomUtil.randomNumbers(6);
String orderNo = nowTimeStr + reportId + sixRandomNumber;
return orderNo;
}