水滴筹面试

一、问:都做过哪些项目,用了什么?

  答:用Servlet和Hibernate做过一个简单的登录界面;用SpringMVC  Mybatis  Redis做过一个宠物商店的系统;

二、问:那你用过Hibernage和Mybatis,那你从你具体使用中感觉到二者的不同是什么?

  答:两者都能屏蔽jdbc api的繁琐操作,但是呢,Hibernate是全自动ORM映射,而Mybatis是半自动的,Hibernate会将所有的SQL操作写好封装 ,而Mybatis则可以自己使用动态SQL进行灵活书写MYSQL代码。(忘记说Hibernate相对较快;Mybatis相对较慢了);

三、问:你说你做过宠物商店的系统,那如果有库存问题,减库存是在什么时候?添加到购物车之后还是结算的时候?

  答:结算的时候,因为添加到 购物车并没有真正将库存减少,如果在添加到购物车 时候就减库存,那其他用户购买的时候就会出现库存不足现象,可是实际上库存仍然有。

四、问:那如果库存有10件,一个人添加到购物车9件,还有一件,另外一个人也要买9件,怎么控制才能不出问题?

  答:可以使用乐观锁机制,在数据库添加一个version字段,通过每次取出货物使用货物后将该字段加一,当存入时如果存入version的数字大于数据库中的version才能插入。

五、问:那既然说到了乐观锁,你说一下乐观锁和悲观锁的区别

  答:悲观锁悲观的认为一个资源同时会有许多线程来调用,是将一个资源只分配给一个线程,当一个线程占有该资源的时候,会给该资源上互斥锁,其他的线程就无法在访问该资源,类似于我们java api用过的sychonized;

    乐观锁就是乐观的认为一次只有一个线程来调用资源,具体用法我上面说过了。

  问:乐观锁只有这一种实现?

  答:我好像就见过这一种,没学过第二种。(实际上第二种是CAS机制进行乐观锁实现,原理如下:CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。   

    CAS 操作中包含三个操作数 —— 需要读写的内存位置(V)、进行比较的预期原值(A)和拟写入的新值(B)。如果内存位置V的值与预期原值A相匹配,那么处理器会自动将该位置值更新为新值B。否则处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前值。)CAS 有效地说明了“ 我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。 ”这其实和乐观锁的冲突检查+数据更新的原理是一样的。JDK的一些无锁的并发容器是基于CAS做的(如:ConcurrentHashMap))https://blog.csdn.net/qq_24489717/article/details/78556172

乐观锁CAS自旋缺点:

①  乐观锁只能保证一个共享变量的原子操作。如上例子,自旋过程中只能保证value变量的原子性,这时如果多一个或几个变量,乐观锁将变得力不从心,但互斥锁能轻易解决,不管对象数量多少及对象颗粒度大小。

②  长时间自旋可能导致开销大。假如CAS长时间不成功而一直自旋,会给CPU带来很大的开销。

③  ABA问题。CAS的核心思想是通过比对内存值与预期值是否一样而判断内存值是否被改过,但这个判断逻辑不严谨,假如内存值原来是A,后来被一条线程改为B,最后又被改成了A,则CAS认为此内存值并没有发生改变,但实际上是有被其他线程改过的,这种情况对依赖过程值的情景的运算结果影响很大。解决的思路是引入版本号,每次变量更新都把版本号加一。

六、问:好吧,那你学过数据结构吧?说一下什么是二叉树吧

  答:二叉树是最多有两个分支节点的树,左节点叫左子树,右节点叫右子树。

  问:那你说一下怎么实现二叉树倒置?

  答:不好意思,我不太会这个,我会二叉树的先序后序中序遍历。。。。

    (二叉树倒置:https://www.cnblogs.com/grandyang/p/5172838.html)

七、问:多线程学过吧?你说一下wait和sleep的区别?

  答:wait是object类下的方法,sleep是Thread类下的方法,wait线程后,放弃锁资源,只有notify和notifyall方法可以将其唤醒;sleep可以将其中设置参数,参数为毫秒时间,到时间后会自动唤醒。

  问:那有没有什么方法可以打断sleep方法?

  答;我记得有个interrupt的方法可以打断sleep方法;

  问:那这个interrupt放在什么位置来打断这个sleep方法?

  答:不怎么用过,只是听说过。https://www.cnblogs.com/carmanloneliness/p/3516405.html

八、问:想一下ip地址用什么类型存比较好?

  答:使用String。

  问:还有更好的么?

  答:用hashmap,因为一个域名当做键,用ip当值,可以一一对应容易查找;

  问:我只想存ip地址呢?

  答:如果只是存储的话可以使用Linkedlist,因为使用了链式结构,可以快速存取。

  问:还有么?

  答:想不出来了。。。

  问:int多少字节?long多少字节?

  答:int32位,4字节;long 64位,8字节;

  问:ip地址多少位?

  答:32位

  问:分几段

  答:4段

  问:那你想一下那什么存?

  答:是int么?但是里面的冒号怎么办?

  问:冒号有意义么?

  答:没有。。

  问:那你再想想怎么用int存一个ip网段?

  答:用最后一段从255-0,之后转化成二进制

  问:你见过ip地址最后是0和255的么?

  答:没有。。。

  问:为啥没见过?

  答:因为。。。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwpfx.html