synchronized关键字,同时可以保证原子性、可见性以及有序性的

    原子性的层面而言,他加了以后,有一个加锁和释放锁的机制,加锁了之后,同一段代码就只有他可以执行了

    可见性,可以保证可见性的,他会通过加入一些内存屏障,他在同步代码块对变量做的写操作,都会在释放锁的时候,全部强制执行flush操作,在进入同步代码块的时候,对变量的读操作,全部会强制执行refresh的操作

    更新的数据,别的县城关只要进入代码块,就一定可以读到的

    有序性,synchronized关键字,他会通过加各种各样的内存屏障,来保证说,解决LoadLoad、StoreStore等等重排序

    synchronized:

    (1)原子性:加锁和释放锁,ObjectMonitor
    (2)可见性:加了Load屏障和Store屏障,释放锁flush数据,加锁会refresh数据
    (3)有序性:Acquire屏障和Release屏障,保证同步代码块内部的指令可以重排,但是同步代码块内部的指令和外面的指令是不能重排的