JMM以及并发三大特性介绍(包括解决方案)

时间:2023-03-09 05:56:53
JMM以及并发三大特性介绍(包括解决方案)

JMM结构图:

JMM以及并发三大特性介绍(包括解决方案)

JMM对同步的8种操作:

JMM以及并发三大特性介绍(包括解决方案)

JMM以及并发三大特性介绍(包括解决方案)

JMM的同步规则:

JMM以及并发三大特性介绍(包括解决方案)

JMM以及并发三大特性介绍(包括解决方案)

JMM以及并发三大特性介绍(包括解决方案)

JMM以及并发三大特性介绍(包括解决方案)

Countdownlatch介绍:

JMM以及并发三大特性介绍(包括解决方案)

该类功能是可以阻塞线程,并在保证线程满足特定条件下,继续执行。如上图,Countdownlatch的cnt初始值是3,线程A调用await()方法,会阻塞,t1,t2,t3每次执行会将cnt-1,然后继续执行。直到cnt的值为0,则TA继续执行。

JMM以及并发三大特性介绍(包括解决方案)

假设只有两个车道,同一地点,只能同时有两辆车通过,即并发就是两个。Semaphore优势是可以控制同一时间,线程的并发量。

JMM以及并发三大特性介绍(包括解决方案)

原子性介绍:

先看看jdk中atomic包中的原子类:

JMM以及并发三大特性介绍(包括解决方案)

看下图程序,拿atomicInteger

JMM以及并发三大特性介绍(包括解决方案)

当调用count的incrementAndGet方法时候,内部调用下图所示方法:

JMM以及并发三大特性介绍(包括解决方案)

Var1指的是count对象,

底层是compareAndSwapInt,该方法是个本地方法,从名字看出就是CAS操作。含义是拿到var2主内存的值和传入的var2值比较,如果相同,则执行相加操作。

atomicRefence的用法:

下图最后结果是4

JMM以及并发三大特性介绍(包括解决方案)

AtomicIntegerFieldUpdater用法:

JMM以及并发三大特性介绍(包括解决方案)

atomicBoolean里的cas,只能执行一次。含义是多个线程同时执行,只有一个线程执行该操作,其他线程不能执行。

JMM以及并发三大特性介绍(包括解决方案)

比如下面代码结果一定是true,因为虽然有5000个线程同时运行,只有一个线程修改AtomicBoolean属性的变量

JMM以及并发三大特性介绍(包括解决方案)

JMM以及并发三大特性介绍(包括解决方案)

ABA问题:是指在某个线程CAS操作的时候,其他线程将A改成了B又改回了A,此时CAS发现A和底层的值A没有变。为了解决这个问题,

JMM以及并发三大特性介绍(包括解决方案)

注:1.如果子类继承了父类,子类调用父类中synchronized方法,是没有同步效果的(synchronized不属于方法声明);、

2. synchronized,修饰非静态方法或者代码块时候,锁定的是调用的对象。一个类的两个不同对象调用该类的非静态同步方法,由于锁对象不同,是每个对象本身,所以是不起同步作用的。

如果修饰类或者静态方法或者静态代码块,锁定的就是这个类,此时,一个类的不同实例。两者很有区别。

原子对比:

JMM以及并发三大特性介绍(包括解决方案)

下面介绍可见性:

JMM以及并发三大特性介绍(包括解决方案)

Volatile可见性实现的方式(注意:volatile没有原子性)

JMM以及并发三大特性介绍(包括解决方案)

实现原理概括就是,读取一个变量的时候,会强迫从主内存中读取该变量,而写一个变量的时候会强迫从线程工作空间刷新到主内存。具体如下:

JMM以及并发三大特性介绍(包括解决方案)

JMM以及并发三大特性介绍(包括解决方案)

关于有序性:

指令重排序不会影响单线程,但是会影响多线程

JMM以及并发三大特性介绍(包括解决方案)

JVM的happend-before原则:

JMM以及并发三大特性介绍(包括解决方案)

JMM以及并发三大特性介绍(包括解决方案)

JMM以及并发三大特性介绍(包括解决方案)

如果两个操作的执行,不能从happens-before原则中推导出来,那么就不能保证他们的有序性,虚拟机可以随意的对他们进行重排序。