后台开发面试题(.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