简述乐观锁和悲观锁原理,和其实现方式?
乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)。
悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。
像 Java 中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。
面试必备之乐观锁与悲观锁
简述JVM原理?及其调优工具?XXmXXnXXs区别?
JVM其实就类似于一台小电脑运行在windows或者linux这些操作系统环境下即可。它直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作。详细
Java文件经过编译后变成 .class 字节码文件
字节码文件通过类加载器被搬运到 JVM 虚拟机中
虚拟机主要的5大块:方法区,堆都为线程共享区域,有线程安全问题,栈和本地方法栈和计数器都是独享区域,不存在线程安全问题,而 JVM 的调优主要就是围绕堆,栈两大块进行
jdk自带监控工具:jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。
第三方有:GChisto,一款专业分析gc日志的工具
Xms 是指设定程序启动时占用内存大小。
Xmx 是指设定程序运行期间最大可占用的内存大小。
Xmn 是指年轻代大小。
Xss 是指设定每个线程的堆栈大小。详细
简述Get和Post区别?
1、post请求更安全;post请求不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中,get请求的是静态资源,则会缓存,如果是数据,则不会缓存。2、post请求发送的数据更大,get请求有url长度限制。3、post请求能发送更多的数据类型,get请求只能发送ASCII字符。4、传参方式不同。5、get产生一个TCP数据包;post产生两个。
网关实现原理?鉴权实现原理?
微服务背景下,一个系统被拆分为多个服务,但是像安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现,这使得我们做了很多重复的事情并且没有一个全局的视图来统一管理这些功能。
逻辑是根据配置的路由对请求进行预处理和转发。收到请求后根据路由的匹配条件找到第一个满足条件的路由,然后请求在被该路由配置的过滤器处理后由 Netty Client 转到目标服务。服务返回响应后会再次被过滤器处理,最后返回给 Client。
项目中担任的角色?负责什么?
算法题
1.打印九九乘法表
public calss JavaDemo{
public static void main(String [] args){
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(i+"*"+j+"="+i*j+" ");
}
System.out.println();
}
}
}
2.打印水仙花
public class JavaDemo2{
public static void main(String[] args) {
int count = 0;
for (int i=100; i<1000; ++i) {
int a = i%10;
int b = (i/10)%10;
int c = i/100;
if ((a*a*a + b*b*b + c*c*c) == i) {
count++;
System.out.println("第" + count + "个水仙花数为:" + i);
}
}
System.out.println("水仙花数的个数为:" + count);
}
}
3.不用stream写出所有单位的关系信息(用递归)
@Data
public class Department{
private String id;
private String parentId;
private String depName;
public boolean equals(Object obj){
if(this.id.equals(((Department)obj).getId()))
return true;
else
return false;
}
}
public void test(){
List<Department> deps = new ArrayList<Department>();
Department d3 = new Department();
d3.setId("003");
d3.setParentId("002");
d3.setDepName("产品部");
deps.add(d3);
Department d1 = new Department();
d1.setId("001");
d1.setParentId(null);
d1.setDepName("技术部");
deps.add(d1);
Department d2 = new Department();
d2.setId("002");
d2.setParentId("001");
d2.setDepName("研发部");
deps.add(d2);
List<Department> ds = this.getDeps(d1,deps);
ds.add(0, d1);
for(Department dep : ds)
System.out.println(dep.getDepName());
}
public List<Department> getDeps(Department department,List<Department> allDeps){
List<Department> child= new ArrayList<Department>();
List<Department> result = new ArrayList<Department>();
for(Department dep : allDeps)
if(dep.getParentId() != null && dep.getParentId().equals(department.getId()))
child.add(dep);
result.addAll(child);
for(Department dep : child)
result.addAll(getDeps(dep,allDeps));
return result;
}
4.图形界面开发
public class F extends JFrame implements ActionListener{
}