Java多线程(二)

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

一,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框架

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

volatile实现可见性但不保证原子性

   volatile关键字:能够保证volatile变量的可见性不能保证volatile变量复合操作的原子性         volatile如何实现内存可见性:        深入来说:通过加入内存屏障和禁止重排序优化来实现的。对volatile变量执行写操作时,会在写操作后加入一条store屏

Volatile关键字

Volatile关键字①volatile的两个特点1保证线程(CPU)之间的可见性;(也就是保证数据一致性)简单解释一下:一个线程将一个值的数值改变时,另一个使用该数值的线程能看到这种改变;2禁止指令重排序(禁止乱序执行);这个和单例

Java多线程之volatile详解

目录:什么是volatile?JMM内存模型之可见性volatile三大特性之一:保证可见性volatile三大特性之二:不保证原子性volatile三大特性之三:禁止指令重排小结1.什么是volatile?答:volatile是java虚拟机提供的轻量级的同步机制(