美文网首页
美团面试准备

美团面试准备

作者: lereina | 来源:发表于2019-05-28 11:56 被阅读0次

1.volatile关键字的底层实现

在并发编程中会遇到三个问题:原子性、可见性、有序性

volatile主要解决了可见性和有序性:当一个共享变量被volatile修饰时,它能保证修改的值立马被更新到内存,当其他线程需要读取变量时,可以到内存中读取。通过禁止指令重排序来实现有序性。

volatile变量原则——对一个变量的写操作优先于对一个变量的读操作。

volatile利用的其实就是内存模型的缓存一致性原则:在内存的变量被修改时,如果它发现该变量是共享变量,在其他cpu有副本,那么其他cpu的副本就会被设置为无效,当其他cpu读取变量时发现无效就会去读取内存中的变量。

在使用volatile关键字时,会多出一个lock前缀指令:相当于一个内存栅栏:

lock前缀指令

使用volatile要注意两个情况:对变量的写操作不依赖当前值;变量没有包含在其他变量的不定式中

2.快排以及时间复杂度

快速排序:找到一个基准数,左边的数都比它小,右边的数都比它大。两个指针,一个从前往后(i)一个从后往前(j),从后往前(j)的先走,当j找到了一个比基准数小的数,就停下,然后让i移动直到找到基准数大的数,然后交换i和j位置上的数,最后将j和i相等位置上的数和基准数相换

3.java中线程如何交互?

线程交互

4.java中的锁机制

独享锁/共享锁:独享锁就是该锁一次只能被一个线程所拥有;共享锁是该锁可被多个线程所持有。

公平锁/非公平锁:公平锁是指多个线程按照申请锁的顺序来获取锁;非公平锁就是获取锁的顺序并不是按照申请锁的顺序,有可能是后申请的线程比先申请的线程优先获取锁(可能会造成饥饿现象)

可重入锁:同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取(避免死锁)

乐观锁/悲观锁:乐观锁认为不存在很多的并发更新操作,不需要加锁,数据库中乐观锁的实现一般采用版本号,java中可使用CAS实现乐观锁。悲观锁认为存在很多并发更新操作,采取加锁操作,如果不加锁一定会出现问题。

分段锁:分段锁是一种锁的设计,ConcurrentHashMap就是通过分段锁来实现高效的并发操作。

自旋锁:尝试获取锁的线程不会阻塞,而是采用循环的方式尝试获取锁。好处是减少上下文切换,缺点是一直占用CPU资源。

偏向锁/轻量级锁/重量级锁:不断升级

偏向锁/轻量级锁/重量级锁

5.悲观锁和乐观锁,mysql中怎么实现?java中怎么实现?

MySql通过版本号来实现乐观锁,select......for update来实现悲观锁

java通过CAS来实现乐观锁,synchronized实现悲观锁

6.长连接和短连接

8.泛型

9.常见的异常类

10.单例模式(线程安全、双重检查)

11.Spring了解

SpringBoot和Spring的区别:

12.常见的排序算法

14.同步的控制方法

15.integer和int的区别

16.重写和重载的区别

17.HashMap和HashTable的区别

HashMap和TreeMap的区别:

HashMap和LinkedHashMap的区别:

LinkedHashMap通过双向链表实现有序的HashMap

HashMap和ConCurrentMap的区别:

18.抽象类和接口的区别

19.数据库索引

20.java lock的实现,公平锁,非公平锁

看第4点

21.常见的设计模式

22.多线程中断的原理

23.B+,B-,红黑树,二叉搜索树,平衡搜索树

还没有看。。。

24.线程池

25.优化sql

索引,视图

26.ACID,隔离级别

27.JVM类加载机制

28.JVM分区

29.GC算法

30.垃圾收集器

31.collections

看HashMap和HashTable那块

32.创建线程的方法

相关文章

网友评论

      本文标题:美团面试准备

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