Java并发编程与高并发解决方案之多级缓存

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并发编程与高并发解决方案之多级缓存_第1张图片

3,同步八种操作

Java并发编程与高并发解决方案之多级缓存_第2张图片

Java并发编程与高并发解决方案之多级缓存_第3张图片

4,同步规则

Java并发编程与高并发解决方案之多级缓存_第4张图片

Java并发编程与高并发解决方案之多级缓存_第5张图片

Java并发编程与高并发解决方案之多级缓存_第6张图片

Java并发编程与高并发解决方案之多级缓存_第7张图片

JMM同步操作工作流程

Java并发编程与高并发解决方案之多级缓存_第8张图片

5,线程安全性

Java并发编程与高并发解决方案之多级缓存_第9张图片

其主要表现在

Java并发编程与高并发解决方案之多级缓存_第10张图片

A,原子性  --Atomic包.

a,

public static AtomicInteger count = new AtomicInteger(0);

方法中:

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

源码解读:

使用了unsafe类,

Java并发编程与高并发解决方案之多级缓存_第11张图片

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

用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 count = new AtomicReference<>(0);

Java并发编程与高并发解决方案之多级缓存_第12张图片

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

Java并发编程与高并发解决方案之多级缓存_第13张图片

d,

AtomicStampedReference,解决cas的ABA问题.

e,

AtomicLongArray

f,

private static AtomicBoolean isHappened = new AtomicBoolean(false);

希望只执行一次.

B,锁

Java并发编程与高并发解决方案之多级缓存_第14张图片

a,

synchronized介绍:

Java并发编程与高并发解决方案之多级缓存_第15张图片

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并发编程与高并发解决方案之多级缓存_第16张图片

E,可见性;

synchronized的两条规定:

Java并发编程与高并发解决方案之多级缓存_第17张图片

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

Java并发编程与高并发解决方案之多级缓存_第18张图片

Java并发编程与高并发解决方案之多级缓存_第19张图片

 F,有序性.

Java并发编程与高并发解决方案之多级缓存_第20张图片

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

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

Java并发编程与高并发解决方案之多级缓存_第21张图片

Java并发编程与高并发解决方案之多级缓存_第22张图片

Java并发编程与高并发解决方案之多级缓存_第23张图片

Java并发编程与高并发解决方案之多级缓存_第24张图片

 

你可能感兴趣的:(Java并发编程与高并发解决方案之多级缓存)