Java多线程(二)

Wesley13
• 阅读 815

---恢复内容开始---

一,volatile关键字

当多个线程操作共享数据时,可以保证内存中的数据可见性

相较于synchronized关键字:

1,不具备“互斥性”

2,不能保证变量的原子性

二,原子变量

volatile保证内存可见性

CAS(Compare-And-Swap)算法保证数据的原子性

内存值 V

预估值 A

更新值 B

当且仅当V==A时,V=B

三,ConcurrentHashMap

ConcurrentHashMap采用“锁分段”机制,共有16个分段,JDK1.8以后也采用CAS

四,集合并发迭代问题

当对集合用Iterator进行迭代时,如若此时往集合中添加数据,则会报并发异常

五,闭锁

CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待

闭锁可以延迟线程的进度直到其达到终止状态闭锁可以用来确保某些活动直到其他活动都完成才继续执行:

  确保某个计算在需要的所有资源都被初始化之后才继续;

  确保某个服务在其依赖的所有其他服务已经启动之后才启动;

  等待直到某个操作所有参与者都准备就绪再继续执行

六,用于解决多线程安全问题的方式

1,同步代码块

2,同步方法

3,Lock

七,Condition控制线程通信

Condition接口描述了可能会与锁有关联的条件变量,这些变量在用法上与Object.wait访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个Lock可能与多个Condition对象关联。为了避免兼容性问题,Condition方法的名称与对应的Object版本中不同

在Condition对象中,与wait、notify和notifyAll方法对应的分别是await、signal和signalAll

Condition实例实质上被绑定到一个锁上。要为特定Lock实例获得Condition实例,使用其newCondition()方法

八,读写锁(ReadWriteLock)

写写/读写,需要互斥

读读,不需要互斥

九,线程八锁

线程八锁的关键

非静态方法的锁默认为this,静态方法的锁为对应的Class实例

某一时刻,只能有一个线程持有锁,无论几个方法

十,线程池

线程池的体系结构

java.util.concurrent.Executor:负责线程的使用和调度的根接口

   |--ExecutorService 子接口,线程池的主要接口

      |--ThreadPoolExecutor 线程池的实现类

      |--ScheduledExecutorService 子接口,负责线程调度

        |--ScheduledThreadPollExeCutor继承ThreadPoolExecutor,实现ScheduledExecutorService

主要用工具类Executors的工厂方法,相当于集合容器的Collections工具类

ExecutorService newFixThreadPool():创建固定大小的线程池

ExecutorService newCachedThreadPool():缓存线程池,线程池的数量不固定,可以根据需求自动的更新数量

ExecutorService newSingleThreadPoolExecutor():创建单个线程池,线程池中只有一个线程

ScheduledExecutorService newScheduledThreadPool():创建固定大小的线程,可以延迟或定时的执行任务

十一,fork/join框架

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
volatile实现可见性但不保证原子性
   volatile关键字:能够保证volatile变量的可见性不能保证volatile变量复合操作的原子性         volatile如何实现内存可见性:        深入来说:通过加入内存屏障和禁止重排序优化来实现的。对volatile变量执行写操作时,会在写操作后加入一条store屏
Wesley13 Wesley13
3年前
Volatile关键字
Volatile关键字①volatile的两个特点1保证线程(CPU)之间的可见性;(也就是保证数据一致性)简单解释一下:一个线程将一个值的数值改变时,另一个使用该数值的线程能看到这种改变;2禁止指令重排序(禁止乱序执行);这个和单例
Wesley13 Wesley13
3年前
Java多线程之volatile详解
目录:什么是volatile?JMM内存模型之可见性volatile三大特性之一:保证可见性volatile三大特性之二:不保证原子性volatile三大特性之三:禁止指令重排小结1.什么是volatile?答:volatile是java虚拟机提供的轻量级的同步机制(
Wesley13 Wesley13
3年前
Java 深入理解volatile关键字
我们知道Java中volatile实现了修饰变量的原子性以及可见性,并且为了实现多线程环境下的线程安全,禁止了指令重排。首先我们先来了解一下happensbefore原则、asifserial语义以及数据依赖性,引用自《Java并发编程的艺术》happensbefore简介从JDK5开始,Java使用新的JSR133内存模型
Wesley13 Wesley13
3年前
JAVA 并发包
Java.Utril.ConcurrentVolatile关键字避免java虚拟机指令重排序,保证共享数据修改同步,数据可见性。volatile相较于synchronized是一种比较轻量级地同步策略,但不具备互斥性,不能成为synchronized的替代,不能保证原子性。
Wesley13 Wesley13
3年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Wesley13 Wesley13
3年前
Java 多线程:volatile关键字
概念volatile也是多线程的解决方案之一。\\volatile能够保证可见性,但是不能保证原子性。\\它只能作用于变量,不能作用于方法。当一个变量被声明为volatile的时候,任何对该变量的读写都会绕过高速缓存,直接读取主内存的变量的值。如何理解直接读写主内存的值:回到多线程生成的原因(Java内存模型与
Wesley13 Wesley13
3年前
Java 开发, volatile 你必须了解一下
并发的三个特性首先说我们如果要使用volatile了,那肯定是在多线程并发的环境下。我们常说的并发场景下有三个重要特性:原子性、可见性、有序性。只有在满足了这三个特性,才能保证并发程序正确执行,否则就会出现各种各样的问题。原子性,上篇文章说到的CAS和Atomic\类,可以保证简单操作的原子性,对