关于java并发你需要了解的基础

并发的目的

  压榨多核cpu的性能(提高程序运行效率)

并发风险

  1. 性能问题
    上下文频繁切换:切换时需要记住当前线程运行到哪,要保存当前线程所有变量

  2. 活跃性问题
    饥饿:优先级低的线程永远抢不到资源
    死锁:A等B,B等A
    活锁:A让B,B让A

  3. 线程安全
    加锁解决: 进程内的用JVM内部的锁,跨JVM的用分布式锁。难点在于如何判断是否存在线程安全问题。

多CPU之间的变量同步

   通过cpu高速缓存锁。下图是多cpu多核硬件架构图。
在这里插入图片描述

   从图中可知,多cpu之间除了共享主存外,还会共享三级缓存(L3)。简单来说,多cpu之间变量同步就是通过给缓存加锁(触发MESI等缓存一致性协议)实现的。
   如果仅仅实现多cpu变量同步,给主存加锁(总线锁)也可以实现,但是会面临两个问题:1、阻塞其它cpu对其它部件的访问;2、主存IO的速度较慢。
在这里插入图片描述
   有个问题需要注意,缓存一致性协议保证的是最终一致性而非顺序一致性,或者说只保证了可见性和有序性而非原子性,因此它并不能保证线程安全。

JMM内存模型(Java Memory Model)

  JMM是一种抽象的模型。尽可能映射成多CPU的硬件架构:JMM的内存->CPU高速缓存、JMM主内存->主存。
  一个例子:java变量前加关键字Volatile,作用就是通过在机器指令前加“lock”命令,从而触发缓存一致性协议,因此保证了变量在线程见的可见性。这里多说一句,前文已经提到缓存一致性协议无法保证线程安全,因此Volatile关键字也无法保证线程安全。

线程(池)相关

单独整理,详见:

Synchronized

  用法
在这里插入图片描述

  互斥性:synchronized修饰的代码块、实例方法、静态方法,被多线程并发访问时,只能有一个线程获取到锁,其它线程都处于阻塞等待状态。
  可见性:某个线程在进入同步块之前或在synchronized中对共享变量的操作,对于后续有同一个监视器锁的其它线程可见。
  原理简介。Synchronized是java的关键字,是java世界里最基本的互斥手段。早期的java使用的是monitor机制来实现synchronized的功能:在java.lang.Object类中定义了wait()、notify()等方法,实际上是给每个对象加了重量级锁,这些方法最终是通过JVM调用操作系统的互斥原语mutex来实现。这种机制使得synchronized需要进行“用户态”和“内核态”之间的切换,从而导致性能问题。从JDK6开始对sychronized进行了多种优化(不再需要“用户态”和“内核态”之间的切换),例如CAS自旋、偏向锁、轻量级锁等,这里不再深入。

java中锁的分类

在这里插入图片描述

CAS是什么

  即Compare And Swap(比较与交换),是一种无锁算法。在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。特点是无锁和无阻塞并发。伴随着CAS会经常出现的名词是“自旋”,自旋就是当前线程不断地比较自己工作内存和主存中的某个变量值,从而保证这个变量的线程安全。CAS的两个明显缺点:1、如果自旋多次会给cpu造成一定压力;2、只能保证对一个变量的原子性操作。

AQS是什么

  即AbstractQueuedSynchronizer,位于java.util.concurrent包,其内部定义了很多和锁相关的方法。JDK中大部分同步类,例如Lock、Latch、ReentrantLock等,都是基于AQS实现的。
  AQS有几个特点:1、内部会维护一个int类型的state属性,用以表示资源的可用状态;2、定义了两种资源的共享方式,即独占(Exclusive,例如ReetrantLock)或共享(Share,例如CountDownLatch);3、定义了两种类型的队列,即同步队列(双向链表实现)和条件队列(单向链表实现)

ReenTrantLock简介和源码导读

ReenTrantLock简介和源码导读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值