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,等
如果两个线程同时访问同一个对象的引用,两个线程拥有的是这个变量的私有拷贝.
3,同步八种操作
4,同步规则
JMM同步操作工作流程
5,线程安全性
其主要表现在
A,原子性 --Atomic包.
a,
public static AtomicInteger count = new AtomicInteger(0);
方法中:
private static void add() {
count.incrementAndGet();
// count.getAndIncrement();
}
源码解读:
使用了unsafe类,
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);
private static AtomicIntegerFieldUpdater updater =
AtomicIntegerFieldUpdater.newUpdater(AtomicExample5.class, "count");
public volatile int count = 100;//修改时必须用volatile修饰,非static.
d,
AtomicStampedReference,解决cas的ABA问题.
e,
AtomicLongArray
f,
private static AtomicBoolean isHappened = new AtomicBoolean(false);
希望只执行一次.
B,锁
a,
synchronized介绍:
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:对比:
E,可见性;
synchronized的两条规定:
volatile:不具有原子性,不适合写操作,可以用作的标志位的判断.
F,有序性.
volatile可以保证一定的有序性,synchronized,lock可以保证有序性.
JMM具备一些先天的有序性,(happens-before原则)