![](https://img-blog.csdnimg.cn/20200510212941795.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java并发包
对 Java 的并发包(JUC)的介绍
朱古力...
这个作者很懒,什么都没留下…
展开
-
11 线程池 线程调度
线程池 线程调度 1. 线程池 线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应速度。 线程池的体系结构 java.util.Concurrent.Executor :负责线程的使用与调度的根接口。 ExecutorService子接口:线程池的主要接口。 ThreadPoolExecutor:线程池的实现类。 ScheduledExecutorService子接口:负责线程的调度。 ScheduledThreadPoolExecutor:继原创 2020-05-11 17:59:39 · 109 阅读 · 0 评论 -
10 同步(synchronized)方法的注意事项
同步(synchronized)方法的注意事项 所有的非静态同步方法用的都是同一把锁——实例对象本身(this),也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以无须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。 (1) 一个对象里面如果有多个 synchronized 方法,某一个时刻内,只要一个线程去调用其中的一个synchr原创 2020-05-11 16:45:57 · 153 阅读 · 0 评论 -
09 读写锁 ReadWriteLock
读写锁 ReadWriteLock ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持,而写入锁是独占的。 ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。 ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。 示例: import java.u原创 2020-05-11 16:20:00 · 74 阅读 · 0 评论 -
08 线程按序交替执行案例
线程按序交替执行案例 要求: 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。 如:ABCABCABC…… 依次递归 代码实现: 使用 Lock 锁 使用 Condition 控制线程通信 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.co原创 2020-05-11 15:27:39 · 129 阅读 · 0 评论 -
07 Condition控制线程通信及实现生产者/消费者模型
Condition 控制线程通信 在 Condition 对象中,与 wait、notify 和 notifyAll 方法对应的分别是 await、signal 和 signalAll。 Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得 Condition 实例,使用其 newCondition() 方法。 生产者、消费者模型 import java.util.concurrent.locks.Condition; import java.util.concurren原创 2020-05-11 11:38:09 · 136 阅读 · 1 评论 -
06 同步锁 Lock
同步锁 Lock 用于解决线程安全问题的方式: 1.1 synchronized:隐式锁 (1) 同步代码块 (2)同步方法 1.2 Lock同步锁:显示锁 (1) 需要通过 lock() 方法上锁; (2) 必须通过 unlock() 方法释放锁。 ReentrantLock 实现了 Lock 接口,并提供了与 synchronized 相同的互斥性和内存可见性。但相较于synchronized 提供了更高的处理锁的灵活性。 示例: import java.util.concurrent.lo原创 2020-05-10 21:54:00 · 77 阅读 · 0 评论 -
05 创建线程的方式之实现 Callable 接口
创建执行线程的四种方式: 继承 Thread 类; 实现 Runnable 接口; 实现 Callable 接口; 线程池。 Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口。 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。 而实现 Callable 接口,方法可以有返回值,并且可以抛出异常。 执行.原创 2020-05-10 21:51:51 · 85 阅读 · 0 评论 -
04 CountDownLatch 闭锁
CountDownLatch 闭锁 CountDownLatch 是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行: 确保某个计算在其需要的所有资源都被初始化之后才继续执行; 确保某个服务在其依赖的所有其他服务都已经启动之后才启动; 等待直到某个操作所有参与者都准备就绪再继续执行。 示例: import java.util.concurrent.CountDow原创 2020-05-10 21:50:25 · 60 阅读 · 0 评论 -
03 并发容器类
ConcurrentHashMap Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。 ConcurrentHashMap 同步容器类是 Java 5 增加的一个线程安全的哈希表。对与多线程的操作,介于 HashMap 与 Hashtable 之间。内部采用“锁分段”机制替代 Hashtable 的独占锁,进而提高性能。 java.util.concurrent 此包还提供了设计用于多线程上下文中的 Collection 实现:原创 2020-05-10 21:46:15 · 51 阅读 · 0 评论 -
02 原子变量 CAS算法
原子变量 CAS算法 JDK 1.5 之后 java.util.concurrent.atomic 包下提供了常用的原子变量。 volatile 保证内存可见性。 CAS (Compare-And-Swap) 算法保证数据的原子性。 CAS 算法是硬件对于并发操作数共享数据的支持。 CAS 包含三个操作数:内存值V,预估值A,更新值B。当且仅当 V == A 时,V = B;否则不进行任何操作。 类 AtomicBoolean、AtomicInteger、AtomicLong 和 Atom原创 2020-05-10 21:43:38 · 81 阅读 · 0 评论 -
01 volatile 关键字及内存可见性的介绍
volatile 关键字:内存可见性 1. 内存可见性 内存可见性(Memory Visibility):是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。 可见性错误:是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。 可以通过**同步 (synchronized)**来保证对象被安全地发布。除此之外我们也可以使用一种更加轻量级的 volatile原创 2020-05-10 21:35:23 · 103 阅读 · 0 评论