美文网首页面试
拼多多(未完)

拼多多(未完)

作者: hedgehog1112 | 来源:发表于2019-12-26 06:41 被阅读0次

1、TreeMap查询写入的时间复杂度多少?(O(logN))

2、HashMap线程安全,死锁怎么解决?

synchronize + CAS,扩容时CAS检查是否有修改,否则重试

3、重试有什么问题?怎么解决?

重试通过自旋实现,占用CPU时间,CAS(Compare And Swap)比较和交换,不会线程阻塞,

超时,限定自旋的次数,ABA可通过原理变量AtomicStampedReference解决,用版本号进行比较,超过重试次数synchronize互斥锁

4、CAS和synchronize有什么区别?都用synchronize不行么?

CAS不阻塞,硬件级别实现原子性;synchronize阻塞,JVM级别实现原子性。使用场景不同,线程冲突严重时CAS会造成CPU压力过大,导致吞吐量下降,synchronize先自旋然后阻塞,线程冲突严重仍有高吞吐量,因为线程都被阻塞,不占用CPU

5、get需要加锁么,为什么?不用,volatile关键字

6、volatile的作用是什么?底层怎么实现的?

保证内存可见性,主内存和工作内存,读写内存屏障,happen-before,并在纸上画了线程交互图

7、多核CPU下,可见性怎么保证?(思考了一会,总线嗅探技术)

9、Spring单例怎么实现?(单例注册表)

https://blog.csdn.net/w1014074794/article/details/88403568

饿汉和懒汉都有一个缺点,单例不能被继承。因为构造函数是私有的。而单例注册表的构造函数是protected。可以继承

结合spring实际来说为什么用单例注册表。bean的注册是ioc很重要的一步。spring可以通过@Resource注解实现根据名称注入类。这需要名称和实例一对一关系。hashmap就很适合这样的场景。spring是用的currenthashmap。即保证了线程安全又满足了性能需求。

补充一下:spring其实存的是key和beandefination的键值对。beandefineation规定了是否单例,是否可继承等等信息。这样就可以满足自定义继承和是否单例

相关文章

网友评论

    本文标题:拼多多(未完)

    本文链接:https://www.haomeiwen.com/subject/dgccoctx.html