综合了网上的一些面试经,整理出来一部分资料,后续会有补充,希望大佬们多多指点!
当两个线程竞争同一资源的时候,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。
在同一程序中运行多个线程本身不会导致问题,但是问题在于多个线程访问了相同的资源,如同一内存区(变量、数组、对象)或系统(数据库,web service等)或文件。实际上这些问题只有在一个或多个线程向这些资源做了写操作的时候才有可能发生,只要资源没有发生变化多个线程读取相同的资源就是安全的。
多线程执行以下代码可能会有错:
public class Counter{
protected long count=0;
public void add(long value){
this.counter=this.counter+value;
}
}
当线程A和线程B同时执行一个counter对象的add()方法,我们没有办法知道操作系统何时会在两个线程之间切换。JVM并不是将这段代码视为单条件指令来执行的,而是按照下面的顺序
线程A和B交错会发生:
this.count=0
A:读取this.count到一个寄存器(0)
B:读取this.count到一个寄存器(0)
B:将寄存器中值➕2
B:回写寄存器值(2)到内存,this.count现在等于2
A:将寄存器值+3
A::回写寄存器值(3)到内存,this.count现在等于3
两个线程分别加了2和3到count变量上,两个线程执行结束后count变量的值应该等于5。然而由于两个线程是交叉执行的,两个线程从内存中读出的初始值都是0。然后各自加了2和3,并分别写回内存。最终的值并不是期望的5,而是最后写回内存的那个线程的值,上面例子中最后写回内存的是线程A,但实际中也可能是线程B。如果没有采用合适的同步机制,线程间的交叉执行情况就无法预料。
MVC模式的目的就是实现Web系统的职能分工
Model层实现系统总的业务逻辑,通常可以用JavaBean或EJB来实现
View层用于与用户的交互,通常用JSP来实现
Controller层提供应用的处理过程控制,通常用servlet来实现
RPC(remote procedure call protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务
RMI(remote method invocation)远程方法调用,能够在客户端Java虚拟机上的对象那个像调用本地对象一样调用服务端Java虚拟机中对象的方法
RPC和RMI之间的区别:
RMI中是通过在客户端的stub对象作为这个远程接口进行远程方法的调用,每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用
RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回
RMI只用于Java
RPC是网络服务协议,与操作系统和语言无关
Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据结构
RMI的结果同一由外部数据表示(External Data Represertation,XDR)语言表示,这种语言抽象了字节序类和数据类型结构之间的差异
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
常见的容器有:Apache、IIS、Tomcat、Resin
可以的,但是一个.java源文件可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一致
关于每个编译单元只能有一个public类,也就是表示每个编译单元只能有一个公开的接口,而这个接口由public类来表示。我们可以根据需要在这个俄文件里面添加多个提供辅助功能的package权限的类。但是如果这个编译单元里面有两个或两个以上的public类的话,程序就会不知道从哪里导入,编译器就会报错
Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面
get请求:
post请求:
CORBA(Common Object Request Broker Architecture)公共对象请求代理体系结构
用途:
java虚拟机是执行字节码文件(.class)的虚拟机进程
因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码
java源程序不是直接编译成机器码,而是二次编译的。第一次java源程序被javac编译成.class文件(这个文件和平台无关)。第二次,.class文件被JVM中的解释器编译,解释执行为不同平台所需要的机器码
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。Java的java.util.regex包
是为了为了加快在系统的响应速度而出现的,它在最大程度上减少了服务器端的资源耗用
实现原理:先将img标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再img标签的自定义属性中(比如data-src)。当js监听到该图片元素进入可视窗口时,即将自定义属性中的地址存储到src属性中,达到懒加载的效果。
递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,尾递归方式的特点是在回归过程中不用做任何操作,尾递归占用的栈内存是恒定的
备注:问题整理来源于唐尤华
今天就先更新到这里,当然光靠这些就去面试还是不行的,要多看书多写代码加深理解呢~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。