09
12
NIO-通道 NIO-通道
通道基础 基本 顶层的Channel接口,只有两个操作: 检查一个通道是否打开(isOpen())和关闭一个打开的通道(close())public interface Channel{ public boolean isOpen()
2019-09-12
10
NIO-缓冲区 NIO-缓冲区
缓冲区基础 缓冲区是对基本数据元素数组的封装对象,Buffer类及其专有的子类提供了用于处理数据缓冲区的API 缓冲区不是多线程安全的,多线程同时存取时,需要同步 属性 Capacity(容量): 缓冲区大小,创建时设定,不能更改
2019-09-10
06
并发-原子变量与非阻塞同步机制 并发-原子变量与非阻塞同步机制
原子变量 CAS操作 CAS(比较并交换)包含三个操作,需要读写的内存位置V丶进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子方式用新值B来更新V的值,否则不会执行任何操作,无论位置V的值是否等于A,都将返回V原
2019-09-06
02
并发-构建自定义的同步工具 并发-构建自定义的同步工具
构建自定义的同步工具 现有类库不能提供足够的功能时,可以使用内置的条件队列丶显示的Condition对象或者AbstractQueuedSynchronizer来构建自己的同步器 内置的条件队列 条件队列是指一组在等待某个条件变成真的线程
2019-09-02
08
30
并发-显式锁 并发-显式锁
Lock与ReentrantLock Lock接口 Lock提供了一种无条件的丶可轮询的丶可定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的public interface Lock{ void lock(); //阻塞的
2019-08-30
28
并发-性能与可伸缩性 并发-性能与可伸缩性
影响性能的因素 性能与可伸缩性 可伸缩性指的是: 当增加计算资源时(如CPU丶内存丶存储容量或I/O带宽),程序的吞吐量或处理能力相应地增加 线程引入的开销 在多线程的调度和协调过程中都需要一定的性能开销: 对于为了提升性能而引入的
2019-08-28
27
并发-避免活跃性问题 并发-避免活跃性问题
死锁 当一个线程永远的持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞 eg: 1.线程A持有锁L并想获得锁M,同时线程B持有锁M并尝试获取锁L,那么这两个线程将永远地等待下去,这种情况就是最简单的死锁形式,称为抱死(D
2019-08-27
26
并发-线程池的使用 并发-线程池的使用
线程饥饿死锁 在线程池中,如果任务依赖于其他任务,那么可能产生死锁 饥饿: 一个线程在无限的等待另外一个或多个线程相互传递使用并且永不会释放的资源 死锁: 可以认为是两个线程或者进程在请求对方占有的资源 运行时间较长的任务 如果任务阻塞
2019-08-26
24
并发-任务执行 并发-任务执行
Executor框架 Executors工厂类 newFixedThreadPool创建一个可重用的固定线程数的线程池,以共享的无界队列方式来运行这些线程,当活动线程到达固定数量时,再次加入任务会加入队列等待其他活动线程运行结束,再执行
2019-08-24
22
并发-取消与关闭 并发-取消与关闭
任务取消 取消 java中没有安全的将占方式来停止线程,只有一些协作式的机制 其中一种协作机制,设置某个”已请求取消标志”,而任务将定期的查看该标志,如果设置了这个标志,任务将提前结束,(对于存在阻塞方法的任务,可能永远不会检查到取消标志
2019-08-22
20
并发-构建基础模块 并发-构建基础模块
同步容器类 Vector , Hashtable , Collections.synchronizedXxx等工厂方法创建 这些类实现线程安全方式: 将它们的状态封装起来,并对每个共有方法都进行同步,是的每次只有一个线程能方法容器状态
2019-08-20
18
并发-对象的组合 并发-对象的组合
实例封闭 将数据封装在对象内部,可以将数据的访问限制在对象的方法上,从而更容易确保线程在访问数据时总能持有正确的锁 java类库中有很多线程封闭示例: Collections.synchronizedList及其类似方法,这些工厂方法通过
2019-08-18
1 / 2