某电商公司面试记录

  • 2020 年 6 月 30 日
  • 笔记

某电商公司面试记录

一、逻辑填空和人事面试

首先是给了我一份50道简单逻辑题的测试让我填空;

其次就是人事小姐姐的人事面试。

二、技术面试

以下是面试官的问题:

1.谈谈你对线程的理解;

//www.cnblogs.com/q964024886/p/10763934.html

2.谈谈线程池的优缺点;

优点:a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。

缺点:1.非核心线程的创建时机

      a.核心线程的数量是 corePoolSize 的值,非核心线程的数量是 maxinumPoolSize – corePoolSize ;

      b. 非核心线程创建的触发时机是:当前线程池中核心线程已满,且没有空闲的线程,还有任务等待队列已满,

满足上面的所有条件,才会去创建线程去执行新提交的任务;

      c. 如果线程池中的线程数量达到 maxinumPoolSize 的值,此时还有任务进来,就会执行拒绝策略,抛弃任务或者其他

如果拒绝策略是抛弃任务的话,有一种场景,就会造成大量任务的丢弃,就是瞬时冲高的情况下。

2.排队任务调度策略

     当线程池中核心线程数量已达标,且没有空闲线的情况下,在产生的任务,会加入到等待队列中去,这样一直持续下去,

等到等待队列已满,在来的任务,会创建非核心线程去执行新提交的任务,那么就产生一种结果,在等待队列中的任务是先提

交的任务,反而没有在此时提交的任务先执行。

任务的执行顺序和任务的提交顺序不一致,如果业务需求的任务是有先后依赖关系的,就会降低线程的调度效率

3.什么是线程死锁,如何导致线程死锁的,举个例子;

死锁的定义:

所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

死锁产生的必要条件:

a.互斥条件:线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有线程请求该资源,则请求线程只能等待。

b.不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程倾向夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。

c.请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该线程已被其他线程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

d.循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。即存在一个处于等待状态的线程集合{P1,P2,…,Pn},其中Pi等待的资源被P(i+1)占有(i=0,1,..,n-1),Pn等待的资源被P0占有,

4.如何防止,解决线程死锁;

a.加锁顺序(线程按照一定的顺序加锁

b.加锁时限(线程获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)

5.SSH中三个框架各有什么作用;

//www.cnblogs.com/archermeng/articles/7537657.html

6.Spring核心是什么;

核心就是提供一种新的机制管理业务对象及其依赖关系。IoC(Inversion of Control 控制反转)/ DI (Dependency Injection依赖注入),AOP(面向切面编程)。 

7.谈谈Spring的aop和ioc原理;

     a. IoC: Inversion of Control (控制反转) : 就是把要在程序中实例化的对象配置到文件中,在程序中不用new来产生,而是让容器通过配置文件返回一个给你,好处就是当需要更改业务逻辑时,方便替换对接口的不同实现类。

b. AOP: Aspect Oriented Programming (面向切面编程) 用来在系统中提升业务的分离,把日志、安全、事务等东西和核心业务分离开,甚至核心业务都不知道它们的存在。基本实现就是对相关的方法进行拦截,添加所需的处理动作。

8.谈谈你对Spring事务的理解;

在Spring中,用TransactionManager进行事务管理,通过Spring注入来完成。借助于java的反射机制,在事务控制方法(通常是Service层)的前后获取事务开启session。在执行数据库操作过程中,若出现了异常,spring会捕获该异常并进行回滚操作;若没有出现异常,则其间的数据库操作成功,数据会被提交到数据库的。事务执行完毕,spring会自动关闭需要关闭的东西。

spring容器集成了TransactionTemplate,它封装了所有对事务的处理功能,包括出现异常时的事务回滚、成功时的事务提交等等复杂的业务功能。事务管理由spring容器来管理之后,大大减少了程序员代码量不说,更是对事务管理提供了非常好的控制。

spring对SessionFactory配置也进行了整合,不需要再通过hibernate.cfg.xml来对SessionFactory进行设定,这样就可以利用spring强大的事务管理功能,避免了每次涉及数据库的操作都要获得session实例来启动、提交、回滚事务以及try-catch操作。这其实利用了AOP的思想,使业务开发逻辑更清晰,分工更加明确。

spring中的事务管理要防止出现脏读、不可重复读、幻读问题,就需要将隔离级别设置为“串行化”。

9.mysql有几种范式;

10.MySQL和SqlServer的异同;

1、mysql支持enum,和set类型bai,sql server不支持

2、dumysql不支持nchar,nvarchar,ntext类型

3、mysql的递增语句是zhiAUTO_INCREMENT,而sql server是identity(1,1)

4、sql server默认导出表创建语句的默认值表示是((0)),而在mysql里面是不允许带两括号的

5、mysql需要为表指定存储类型

6、sql server识别符是[],[type]表示他区别于关键字,但是mysql却是 `,也就是按键1左边的那个符号7、sql server支持getdate()方法获取当前时间日期,但是mysql里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数

11.创建数据库要注意什么;

12.如何避免数据脏读;

三、一些心得