1,缓存一致性(MESI),

M:被修改,该缓存行被缓存在该cpu中并且是被修改过的.因此他与主存中的数据是不一致的.在未来的某个时间点写回主存,这个时间点是其他cpu读取相应的内存之前,当被写回主存之后,该缓存行的状态变成独享的.

E:独享,他的缓存行只被缓存在该cpu的缓存中,是未被修改过的与主存中数据是一致的,这个状态可以在任何时刻当有其他cpu读取该内存时,该内存变成共享状态.

S:分享,该缓存行可能被多个cpu进行缓存,并且各个缓存中的数据和主内存的中的数据是一致的.当有一个cpu修改该缓存行的时候,其他cpu的该缓存行是可以被作废的.

I:无效的,可能有其他的cpu修改了该缓存行.

2,JAVA内存模型(java Memory model,  JMM)

JVM包括堆(Heap)和栈(Stack),

Heap:垃圾回收来负责,动态分配内存大小,因为是运行动态分配内存,所以其运行速度相对慢一些.

Stack:比堆快,仅次于计算机里的寄存器,栈数据是可以共享的,存放一下基本类型的变量,比如int,float,short,byte,long,等

如果两个线程同时访问同一个对象的引用,两个线程拥有的是这个变量的私有拷贝.

java二级缓存开源框架 java 多级缓存_i++

3,同步八种操作

java二级缓存开源框架 java 多级缓存_i++_02

java二级缓存开源框架 java 多级缓存_主存_03

4,同步规则

java二级缓存开源框架 java 多级缓存_i++_04

java二级缓存开源框架 java 多级缓存_主存_05

java二级缓存开源框架 java 多级缓存_i++_06

java二级缓存开源框架 java 多级缓存_缓存_07

JMM同步操作工作流程

java二级缓存开源框架 java 多级缓存_主存_08

5,线程安全性

java二级缓存开源框架 java 多级缓存_缓存_09

其主要表现在

java二级缓存开源框架 java 多级缓存_缓存_10

A,原子性  --Atomic包.

a,

public static AtomicInteger count = new AtomicInteger(0);

方法中:

private static void add() {
    count.incrementAndGet();
    // count.getAndIncrement();
}

源码解读:

java二级缓存开源框架 java 多级缓存_缓存_11

使用了unsafe类,

java二级缓存开源框架 java 多级缓存_java二级缓存开源框架_12

var1,当前对象(2),var2,传过来的值(2),var4,要增加的值(1).(比如:2+1=3)============[其实就是工作内存和主内存]

java二级缓存开源框架 java 多级缓存_i++_13

用native标识的一个方法,是java底层的一个方法.不是我们用java实现的一个方法.此方法是cas的核心.

b,

public static AtomicLong count = new AtomicLong(0);//和上类似
public static LongAdder count = new LongAdder();//默认值就是0.高并发的时候可以分散计算,比如64位可以拆成两个32位计算.(有时会不准)

c,

private static AtomicReference<Integer> count = new AtomicReference<>(0);

java二级缓存开源框架 java 多级缓存_java二级缓存开源框架_14

private static AtomicIntegerFieldUpdater<AtomicExample5> updater =
        AtomicIntegerFieldUpdater.newUpdater(AtomicExample5.class, "count");
public volatile int count = 100;//修改时必须用volatile修饰,非static.

java二级缓存开源框架 java 多级缓存_i++_15

d,

AtomicStampedReference,解决cas的ABA问题.

e,

AtomicLongArray

f,

private static AtomicBoolean isHappened = new AtomicBoolean(false);

希望只执行一次.

B,锁

java二级缓存开源框架 java 多级缓存_主存_16

a,

synchronized介绍:

java二级缓存开源框架 java 多级缓存_主存_17

synchronized如果在父类的方法中声明,其子类该方法不带synchronized,因为synchronized不是方法声明的一部分.

代码:

// 修饰一个代码块
public void test1(int j) {
    synchronized (this) {
        for (int i = 0; i < 10; i++) {
            log.info("test1 {} - {}", j, i);
        }
    }
}

// 修饰一个方法
public synchronized void test2(int j) {
    for (int i = 0; i < 10; i++) {
        log.info("test2 {} - {}", j, i);
    }
}
// 修饰一个类
public static void test1(int j) {
    synchronized (SynchronizedExample2.class) {
        for (int i = 0; i < 10; i++) {
            log.info("test1 {} - {}", j, i);
        }
    }
}

// 修饰一个静态方法
public static synchronized void test2(int j) {
    for (int i = 0; i < 10; i++) {
        log.info("test2 {} - {}", j, i);
    }
}

D:对比:

java二级缓存开源框架 java 多级缓存_缓存_18

E,可见性;

synchronized的两条规定:

java二级缓存开源框架 java 多级缓存_java二级缓存开源框架_19

volatile:不具有原子性,不适合写操作,可以用作的标志位的判断.

java二级缓存开源框架 java 多级缓存_java二级缓存开源框架_20

java二级缓存开源框架 java 多级缓存_i++_21

java二级缓存开源框架 java 多级缓存_主存_22

 F,有序性.

java二级缓存开源框架 java 多级缓存_主存_23

volatile可以保证一定的有序性,synchronized,lock可以保证有序性.

JMM具备一些先天的有序性,(happens-before原则)

java二级缓存开源框架 java 多级缓存_主存_24

java二级缓存开源框架 java 多级缓存_主存_25

java二级缓存开源框架 java 多级缓存_java二级缓存开源框架_26

java二级缓存开源框架 java 多级缓存_缓存_27