Immutable Object:不可变对象,在多线程共享变量的情况下,为了保证数据的一致性,往往需要对这些共享变量的访问进行加锁。而锁又会带来一些问题和开销,使用 Immutable Object 可以让我们在不使用锁的情况下,即能保证共享变量带来的线程安全,又能避免引入锁可能带来的问题和开销

    java 线程的监视器:

    • jvisualvm:可视化程序
    • jstack [java进程的pid]
    • java 8:java mission control(JMC)

    原子性:Atomic,操作指相应的操作是单一不可分隔的操作

    如操作 count++

    • 读取count的值
    • 拿count的当前值和1做加法运算
    • 将运算后的值赋值给count

    synchronized:保证了原子性,不保证可见性

    • 多级缓存,非从主存

    volatile:保证可见性,有序性

    实现原理:当一个线程修改了一个volatile修饰的变量的值时,该值会被写入主内存而不仅仅是当前CPU所在的缓存区,而且会使其他CPU的缓存区中存储的该变量的值失效(从而会从主内存更新),保证其他线程访问volatile修饰的变量时总是可以获取到该变量的最新值 volatile能通过线程屏障,禁止指令重排