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能通过线程屏障,禁止指令重排