后台开发面试题(.net与java)
最近面试了几家公司,发现大部分公司面试题有相似的地方。现在此记录下我还记得的一些题:
java面试题答疑(手写arraylist、进制转换、多线程、动态代理)
4.手写一把可重入锁:
public class MyLock implements Lock {
private boolean isLocked = false; //定义一个变量,标记锁是否被使用
private Thread runningThread = null; //第一次线程进来的时候,正在运行的线程为null
private int count = 0; //计数器
@Override
public synchronized void lock() {
Thread currentThread = Thread.currentThread();
//不断的重复判断,isLocked是否被使用,如果已经被占用,则让新进来想尝试获取锁的线程等待,直到被正在运行的线程唤醒
//除了判断当前锁是否被占用之外,还要判断正在占用该锁的是不是本线程自己
while(isLocked && currentThread != runningThread) { //如果锁已经被占用,而占用者又是自己,则不进入while循环
try {
wait();
}catch (InterruptedException e) {
e.printStackTrace();
}
}
//进入该代码块有三种情况:
// 1.第一个线程进来,此时isLocked变量的值为false,线程没有进入while循环体里面
// 2.线程进入那个循环体里面,调用了wait()方法并经历了等待阶段,现在已经被另一个线程唤醒,
// 3.线程不是第一次进来,但是新进来的线程就是正在运行的线程,则直接来到这个代码块
// 唤醒它的线程将那个变量isLocked设置为true,该线程才跳出了while循环体
//跳出while循环体,本线程做的第一件事就是赶紧占用线程,并告诉其他线程说:嘿,哥们,我占用了,你必须等待,计数器+1,并设置runningThread的值
isLocked = true; //将isLocked变量设置为true,表示本线程已经占用
runningThread = currentThread; //给正在运行的线程变量赋值
count++; //计数器自增
}
@Override
public void lockInterruptibly() throws InterruptedException {
}
@Override
public boolean tryLock() {
return false;
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return false;
}
@Override
public synchronized void unlock() {
//线程释放锁,释放锁的过程分为三步
//1. 判断发出释放锁的请求是否是当前线程
//2. 判断计数器是否归零,也就是说,判断本线程自己进来了多少次,是不是全释放锁了
//3. 还原标志变量
if(runningThread == Thread.currentThread()) {
count--;//计数器自减
if(count == 0) { //判断是否归零
isLocked = false; //将锁的状态标志为未占用
runningThread = null; //既然已经真正释放了锁,正在运行的线程则为null
notifyAll(); //通知所有等待的线程,谁抢到我不管
}
}
}
@Override
public Condition newCondition() {
return null;
}
}
---------------------
作者:SpringChang
来源:CSDN
原文:https://blog.csdn.net/zhang5476499/article/details/83794711
版权声明:本文为博主原创文章,转载请附上博文链接!
参考链接:Java并发编程:自己动手写一把可重入锁
5.说几个JAVA中的单例模式,然后你最喜欢用哪个?为什么?
饿汉式和懒汉式。
//第一种形式: 饿汉式单例类
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
//第二种形式:懒汉式单例类
public class Singleton {
private Singleton(){}
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)instance=new Singleton();
return instance;
}
}
第一种形式要更加安全些
instance = new Singleton();
static属于类的资源,类资源在jvm加载类的时候就加载好了,instance一直引用这new Singleton(),所以永远都不会释放一直存在与内存中直到程序结束运行;
第2种的话如果两个线程同一时刻去访问getInstance的时候就可能创建两个实例,所以不安全;
解决办法(加上同步锁)。
参考链接:
6.说说你对Java中的栈内存和堆内存的看法:
参考链接:JAVA面试、进阶必备——堆内存与栈内存
7.http在传输时是无状态的,你是如何解决的:
可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“。
参考链接:Java面试之http知识点(必问)
8.设计一个秒杀系统
参考链接:如何设计一个秒杀系统 秒杀系统设计(JAVA)
9.设计一个大数据高并发系统
秒杀系统和高并发系统均有视频,百度云链接:
链接: https://pan.baidu.com/s/1ooQaputdmsoHm9qT-PyXRw 提取码: 686e
sql注入是什么意思以及防止sql注入?
https://blog.csdn.net/qq_30946681/article/details/80233652
第一种形式要更加安全些
instance = new Singleton();
static属于类的资源,类资源在jvm加载类的时候就加载好了,instance一直引用这new Singleton(),所以永远都不会释放一直存在与内存中直到程序结束运行;
第2种的话如果两个线程同一时刻去访问getInstance的时候就可能创建两个实例,所以不安全;
解决办法(加上同步锁)。
可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“。