您的位置:首页 > 职场人生

由一个面试题引发的思考

2017-09-13 17:23 330 查看
前两天在网上看到一个程序员兄弟谈他的面试经,其中讲了他遇到的一个问题:

给了一张表 三个字段:
id name date
id为主键
现在要求用10个线程向这张表中插入10000条数据
其中id不能是自增,请问该如何实现?能大致说一下思路么?

这样一个问题怎么处理?

是不是似曾相识呢?我们肯定在哪里见过。

说点题外话:为什么不用自增?这里面试官的意图是想考察线程安全方面的处理

  对大型的系统自增会存在以下问题:

  1) 比如做数据库优化,在大表做水平分表时,就不能使用自增Id,因为Insert的记录插入到哪个分表依分表规则判定决定,若是自增Id,各个分表中Id就会重复,在做查询、删除时就会有异常。

  2) 在对表进行高并发单记录插入时需要加入事物机制,否则会出现Id重复的问题。

  3) 在业务上操作父、子表(即关联表)插入时,需要在插入数据库之前获取max(id)用于标识父表和子表关系,若存在并发获取max(id)的情况,max(id)会同时被别的线程获取到。

  4) 可能面临特定的订单号等等需求。

网上查了下,大家推荐使用
AtomicInteger类的
addAndGet方法来实现唯一标示,这样可是实现“线程安全”。


然后,给出1.0的方案:10个线程,每个线程插入1000条数据,那么整体就是10000条数据了,满足要求

MyTread.java

public class Main {
public static void main(String[] args) {
for (int i = 1; i <=10; i++) {
new MyThread().start();
}
}
}


View Code
结果:速度比第一次快了很多:



关于这个面试题,大家如果有好的方法,请尽情提供,大家一起学习下!!

另外关于高并发情况下的线程安全,大家有什么看法?望一起讨论!


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: