蔚来 Java 一面面经
自我介绍
项目相关问答
基本围绕项目问,比如会问redis,rabbitmq,虽然我没有做过,但是他仍然会问一下。
基本上都是有场景的,而且是一个女面试官,第一次遇到啊。
我不会的点,有些是看过忘了啊,,
spring循环依赖
Java的各种锁有什么区别呢?
比如信号量,reentrantlock有什么区别,我是用sychronize有啥区别呢?
mysql的各种事务隔离级别是怎么实现的?比如可提交解决脏读,是如何实现的呢??
最后给了两道题:
1.给你两个账户,实现转账操作,请你实现高效的多线程
我写的代码,我也不知道我这样写于用sychronize有啥区别,我不知道会不会发生死锁。求其他大佬 能够给点意见,如果让你实现一个转账方法,你会怎么实现呢?要考虑哪些呢?求牛油们多多再评论区讨论啊!!!
面试官说我这个代码如果a于b转账,c于d转账会有设么问题,我不知道啊。。
更新:我知道了,如果我用信号量,这样的话,只会有一个线程执行transfer方法,也就是说当a和b进行转账时,c和d就不能转账了。
Semaphore sp = new Semaphore(1); public void transfer2(Account a1,Account a2,double money) { try { sp.acquire(); a1.setBlance(a1.getBlance() - money); a2.setBlance(a2.getBlance() + money); } catch (InterruptedException e) { e.printStackTrace(); }finally { sp.release(); } }比如我之前有一次面试也是转账,是为了解决死锁,所以根据用户id大小来顺序获得锁,避免死锁,
更新:所以应该使用synchronized来获得锁,这样获得用户a和b的锁,不会对用户c和d的锁造成冲突,这样就可以同时转账了。。。
public void transfer3(Account a1,Account a2,double money) { Account first = a1.getId() < a2.getId() ? a1 : a2; Account second = a1.getId() < a2.getId() ? a2 : a1; synchronized (first) { synchronized (second) { a1.setBlance(a1.getBlance() - money); a2.setBlance(a2.getBlance() + money); } } }
2.有一个表,id,name
请你写出创建表的语句
我们要找a开头的名字
我们要找z结尾的名字
我们要找a开头,z结尾的名字
这题让我写出见表语句,所以肯定就是想让我们建立索引了。
如下是我的答案:
create table `test`( `id` long AUTO_INCREMENT, `name` varchar(16) NOT NULL, `name_reverse` varchar(16) NOT NULL, PRIMARY KEY (`id`), key `name` (`name`), key `name_reverse` (`name_reverse`) )ENGINE=InnoDB DEFAULT CHARSET=utf8; select name from test where name like `a%` select name from test where name_reverse like `%z` select name from test where name like `a%` and name_reverse like `z%`