0%

Happens-Before规则是什么 ?

  1. 程序顺序规则:一个线程中的每一个操作,happens-before于该线程中的任意后续操作。

    1
    2
    3
    double pi = 3.14; // A
    double r = 1.0; // B
    double area = pi * r * r; // C

    一个线程中,按照程序顺序,前面的操作 Happens-Before 于后续的任意操作。这个还是非常好理解的,比如上面那三行代码,第一行的 “double pi = 3.14; “ happens-before 于 “double r = 1.0;”,这就是规则1的内容,比较符合单线程里面的逻辑思维,很好理解。

  2. 监视器规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。

阅读全文 »

GC如何判断对象可以被回收

引用计数法(已被淘汰的算法)

  1. 每一个对象有一个引用属性,新增一个引用时加一,引用释放时减一,计数为0的时候可以回收。但是这种计算方法,有一个致命的问题,无法解决循环引用的问题

可达性分析算法(根引用)

阅读全文 »

ConcurrentHashMap底层原理是什么

1.7
数据结构:
内部主要是一个Segment数组,而数组的每一项又是一个HashEntry数组,元素都存在HashEntry数组里。因为每次锁定的是Segment对象,也就是整个HashEntry数组,所以又叫分段锁。
1.7ConcurrentHashMap.png
1.8
数据结构:

阅读全文 »

Class初始化过程是什么

类加载的过程

我们可以先简单说下类加载的过程,大致分为:

*加载、验证、准备、解析、初始化 *几个阶段,使用和卸载都是已经加载完成之后,属于类的生命周期的两个阶段

类的初始化过程

阅读全文 »

ABA问题遇到过吗,详细说一下

  1. 有两个线程同时去修改一个变量的值,比如线程1、线程2,都更新变量值,将变量值从A更新成B。
  2. 首先线程1获取到CPU的时间片,线程2由于某些原因发生阻塞进行等待,此时线程1进行比较更新(CompareAndSwap),成功将变量的值从A更新成B。
  3. 更新完毕之后,恰好又有线程3进来想要把变量的值从B更新成A,线程3进行比较更新,成功将变量的值从B更新成A。
  4. 线程2获取到CPU的时间片,然后进行比较更新,发现值是预期的A,然后有更新成了B。但是线程1并不知道,该值已经有了A->B->A这个过程,这也就是我们常说的ABA问题。

举个具体的例子:

阅读全文 »