
Java并发编程
Java线程学习笔记
一步一个脚印
很普通的我.
展开
-
JCIP_3_对象的共享_笔记总结
JCIP_3_对象的共享_笔记总结多个线程访问共享的可变状态时需要进行正确的管理,可以通过同步来避免多个线程在同一时刻访问相同的数据。同步可以确保以原子的方式执行操作和内存可见性。当一个线程修改了对象状态后其它线程能够看到发生的变化。如何安全地共享和发布对象使其能够被多个线程同时访问?可见性在没有同步的情况下我们无法确保执行读操作的线程能适时地看到其它线程写入的值,为了确保多个线程原创 2015-01-31 20:09:05 · 918 阅读 · 0 评论 -
JCIP_5_04_Java并发容器
并发容器并发容器改进了同步容器的性能,通过并发容器来代替同步容器,可以极大地提高伸缩性并降低风险。原创 2014-09-30 23:13:18 · 1162 阅读 · 0 评论 -
JCIP_5_03_Java同步容器
Java同步容器和并发容器同步容器同步容器将所有对容器状态的修改串行化,以实现它们的线程安全性,这种方法的代价是严重降低并发性。当多个线程竞争容器的锁时,吞吐量将严重减低。同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁来保护复合操作,容器上常见的复合操作包括:迭代、跳转以及条件运算。原创 2014-09-30 23:12:39 · 1097 阅读 · 0 评论 -
JCIP_4_02_扩展现有安全类
扩展现有安全类场景为现存的线程安全类添加功能(对现存的线程安全类进行功能扩展),有时工程中现存的线程安全类只能支持大部分我们需要的操作,此时就需要在不破坏线程安全性的情况下添加一些新的操作。原创 2014-09-30 23:12:17 · 912 阅读 · 0 评论 -
JCIP_4_01_扩展现有安全类_客户端加锁
客户端加锁实践对于类似由Collections.synchronizedList封装的ArrayList这种场景,客户端并不知道同步封装器工厂方法中返回的List对象的具体类型,这时需要对返回的List对象进行扩展,可以考虑只扩展类的功能,但不是扩展类本身,而是将扩展代码放入一个“辅助类”中。该文档记下了在进行辅助类扩展现存线程安全类时,辅助类使用的锁和被扩展的类使用的锁不是同一个,出现了并发问题。所以通过辅助类加锁扩展现存线程安全类实例的功能,需要客户端明确知道被扩展的类实例使用的锁。原创 2014-08-13 05:15:59 · 1325 阅读 · 0 评论 -
JCIP_3_01_实践volatile
volatile实践1、volatile变量不会被缓存在寄存器或对其它处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。2、volatile只确保变量的可见性并不确保原子性,加锁机制既可确保可见性又可确保原子性。3、volatile变量对可见性的影响比volatile变量自身的特性更为重要。当线程A首先写入一个volatile变量并且线程B随后读取该变量时,在写入volatile变量之前对A可见的所有变量的值,在B读取了volatile变量后,对B也是可见的。4、语句重原创 2014-08-13 04:15:01 · 1000 阅读 · 0 评论 -
JCIP_5_02_ConcurrentHashMap分段与锁的学习总结
哈希表基础1.哈希表是基于数组的数据结构2.通过对关键字的哈希运算实现元素的快速定位3.哈希表的重点是哈希化,哈希化负责把一个大范围的数字转化成一个小范围的数字4.哈希化过程中会产生值冲突,这种情况有多种办法可以解决(开放地址法、链地址法)4.1.开放地址法,通过在哈希表中寻找一个空位解决冲突问题,寻找空位的方法也有多种(线性探测、二次探测、再哈希)4.原创 2014-08-13 03:32:16 · 2888 阅读 · 1 评论 -
JCIP_5_01_CopyOnWriteArrayList为什么不会产生ConcurrentModificationException?
CopyOnWriteArrayList为什么不会产生ConcurrentModificationException?场景多线程场景下对未正确处理并发的容器进行迭代会抛出异常(ConcurrentModificationException),并发容器(CopyOnWriteArrayList)不会抛出ConcurrentModificationException,并且该类容器也不需要在客户原创 2014-07-26 17:57:31 · 1994 阅读 · 0 评论 -
Java线程_07_线程池
关键词吞吐量、资源利用率、大量同类型的任务、线程池、工作线程、任务队列应用场景最佳资源利用率程序吞哇量任务明确但数量多thread创建和管理的成本合理构建程序结构,封装对同一类型事物的处理这是有风险的资源都被池给占用了工作线程并发错误工作线程异常产生泄漏工作线程时限被大量的请求压垮主动权在你,你会考虑?考虑和避免任务间原创 2012-11-30 22:32:49 · 1652 阅读 · 0 评论 -
Java线程_06_wait/notify/synchronized
wait/notify/synchronized线程等待/通知机制实现了多个线程基于特定条件的通信机制。线程等待/通知机制必须配合线程同步机制避免资源竞争(Race Condition)产生的数据异常。场景一、等待-通知机制细节(为什么需要引入同步机制?)第一个thread验证通信条件未通知需要调用wait()第二个thread改变通信条件第二个thread调用noti原创 2012-11-18 22:56:17 · 1401 阅读 · 0 评论 -
Java线程_05
被替换掉的同步继承体系结构下父类的某个声明为同步的方法是可以被更加具体的子类覆盖并声明为非同步。示例/** * 父类的synchronized方法可以在子类中改变为非synchronized方法 * @author WangYanCheng * @version 2012-11-12 */public class SynExtends { public s原创 2012-11-13 15:24:45 · 1084 阅读 · 0 评论 -
Java线程_04
线程与Java SwingJava Swing非线程安全多线程情况下访问Swing对象必须要遵守特殊的规则(保证只从单一线程来访问Swing对象)。Swing程序会有多个线程,其中事件派发线程负责对所有Swing对象的访问和对象状态修改,保持所有对Swing对象的访问都被事件派发线程发出是排查多线程问题非常重要的关注点。例外和规则未呈现的Swing对象可被任何的thread原创 2012-10-31 23:19:42 · 1408 阅读 · 0 评论 -
Java线程_03
持有锁的线程释放锁的场景加锁的代码块执行完成加锁的代码块执行过程中出现异常线程终止Object#wait会释放锁不会释放锁sleep()/join()sleep()的目的是让线程暂停指定时间,时间过后线程会继续运行join()的目的是让线程等待指定线程执行完成后,它才开可以运行Thread#interrupt适用与中断处在blocking method状原创 2012-09-30 22:34:06 · 1293 阅读 · 0 评论 -
Java线程_02
多线程间的资源共享关键词synchronized、sychronized块、并发、automic、Mutex Lock、volatile、锁的作用域、Java对象实例上的锁、static method上的synchronized 锁的语法在类对象实例声明的锁,依据修饰符static可区分单实例拥有的锁和多实例共享的锁,通过使用synchronized标记类的某个方法支持同步,它原创 2012-09-02 13:06:54 · 1426 阅读 · 0 评论 -
Java线程_01
线程?可被并行执行的指令序列可被操作系统调度处理的最小单元线程也可被理解为轻量的进程通常情况下线程是被包含在进程内一个进程可包含多个线程,常规情况下,这些线程相互之间会共享资源在多核心CPU上线程是的确可以同时运行的,同时运行的线程受核心数量影响在单核CPU上线程是分时运行的,因为足够快我们感觉不到有什么问题线程的一些应用场景处理和执行异步性质的任务,GUI中通常需要单一Pan原创 2012-08-30 00:01:07 · 1807 阅读 · 0 评论