美文网首页
美团面试准备

美团面试准备

作者: 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