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

 

posted @ 2019-08-19 21:35  Noperx  阅读(125)  评论(0编辑  收藏  举报