《java并发编程实战》笔记
《java并发编程实战》这本书配合并发编程网中的并发系列文章一起看,效果会好很多。
并发系列的文章链接为: Java并发性和多线程介绍目录
建议: 《java并发编程实战》第3章和第4章可以暂时先跳过。。这部分内容的文字和概念很多,代码块偏少。不容易看进去。
一、线程
1.线程的使用可以提升程序的性能。
2.线程如果没有同步,操作的执行顺序是不可预测的。
3.线程之间共享数据时,必须使用同步机制。不然数据会发生无法预料的变化。
二、线程的安全性
0.线程安全性:当多个线程访问某个对象时,这个对象不会出错。
1.构建并发程序,必须正确使用线程和锁。要编码线程安全的代码,其核心在于要对状态访问操作进行管理,特别是共享和可变状态的访问。
2.竞态条件:在并发编程中,由于不恰当的执行时序而出现不正确的结果,称为“竞态条件”
3.加锁机制。
java提供了一种内置的锁机制来支持原子性:同步代码块
public synchronized void methodName() { }
4.假如,在并发编程中,使用synchronzied修饰service层的某个方法,在同一时刻只有一个线程可以执行该方法。
此时,该方法是线程安全的,但是多个客户端无法同时访问该方法,服务的响应效率非常低,性能差。
5.java并发中的特性。
原子性:即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
内存可见性:确保当一个线程修改了对象状态后,其他线程可以看到发生的状态变化。
有序性:即程序执行的顺序按照代码的先后顺序执行。因为尽管jvm的指令重排序不会影响单个线程的执行,
但是会影响到线程并发执行的正确性。
6.同步,可以确保原子性,有序性,可见性。
三、对象的共享
1.如果多个线程同时访问同一个共享变量,没有使用同步机制会导致结果不可预测。
2.volatile这个关键字有什么用?
被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。
volatile变量只能确保可见性,而加锁机制既可以确保可见性,又可以确保原子性。
3.发布,是指使对象能够在当前作用域之外的代码中使用。
逸出,当某个不应该发布的对象被发布时,就称为逸出。
4.线程封闭,就是不在线程之间共享数据。线程封闭可以实现线程安全性。
ThreadLocal,保证了每个线程都有独立的对象副本,保证了对象的唯一性,维持线程的封闭性。
5.不变性,不可变对象一定是线程安全的。
6.final修饰的变量,具有不变性。
五、基础构建模块(介绍juc的api)
1.当普通的同步容器类,例如Vector,HashTable类,如果在迭代过程中被修改,就会抛出一个ConcurrentModificationException。
2.ConcurrentHashMap用于替代同步Map。ConcurrentHashMap基于锁分段技术。在这种机制下,任意数量的读取线程可以并发访问Map,执行读取操作的线程和执行写入操作的线程可以并发地访问Map,并且以一定数量的的写入线程可以并发地修改Map。
3.CopyOnWriteArrayList用于替代同步List。CopyOnWrite,"写时拷背",也就是在每次修改时,都会创建并重新发布一个新的容器副本,从而实现可变性。因此,多个线程可以同时对这个容器进行迭代,而不会彼此干扰或者与修改容器的线程相互干扰。
4.阻塞队列。生产者消费者模式。
阻塞队列先进先出。BlockingQueue。可进行put()和take()操作。
5.阻塞方法和中断方法。interruptedException。
6.并发工具类。闭锁CountCownLatch,信号量Semephore,栅栏Barrier
六、任务执行
1.主要讲Executor框架。为每个任务分配一个线程。
2.无限制创建线程的不足:线程生命周期的开销非常高;资源消耗大;稳定性有影响。
3.Callable和Future,返回通过future.get()获取执行结果。
4.CompletionService相当于将Executor和BlockingQueue的功能整合在一起。
七、取消与关闭
1.中断(interrupt)并不会马上停止目标线程正在进行的工作,而是改变中断状态。。等到调用wait()、sleep()、join()等方法时,才抛出中断的异常InterruptedException 。
2.恢复中断状态的方法: Thread.currentThread().interrupt();
3.还通过Future来实现取消。Future拥有一个cancel(),方法。即 boolean cancel(boolean mayInterruptIfRunning);
可以通过设置mayInterruptIfRunning为true,取消任务。
十五、
1.非阻塞算法 : 如果在某种算法中,一个线程的失败或挂起不会导致其他线程也失败或挂起,那么这种算法就称为“非阻塞算法”
2.无锁算法: 如果在算法的每个步骤中都存在某个线程能够执行下去,那么这种算法也称为“无锁算法”
其他:
1.volatile变量的读/写和CAS可以实现线程之间的通信。
把这些特性整合在一起,就形成了整个concurrent包得以实现的基石。
如果我们仔细分析concurrent包的源代码实现,会发现一个通用化的实现模式:
- 首先,声明共享变量为volatile;
- 然后,使用CAS的原子条件更新来实现线程之间的同步;
- 同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信。
AQS,非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),这些concurrent包中的基础类都是使用这种模式来实现的,而concurrent包中的高层类又是依赖于这些基础类来实现的。从整体来看,concurrent包的实现示意图如下:

疑问:
1.线程安全的概念。
多个线程对数据进行读写时,数据的读写等操作结果保持正确。
2.活跃性。
就是饥饿和公平。
3.竞态条件如何理解??
在并发编程中,由于不恰当的执行时序而出现不正确的结果。
4.@ThreadSafe,这个注解怎么用?
5.ThreadFactory如何理解?
用于创建线程,可以指定线程名称。
6.Future类有什么用?
比ExcutorService多返回一个结果。
7.无阻塞算法是什么?如何区别阻塞算法?
阻塞算法,比如BlockingQueue。。无阻塞算法,比如AtomicInteger.
8.java监视器模式。
《java并发编程实战》笔记的更多相关文章
- HTML+CSS笔记 CSS笔记集合
HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...
- CSS笔记--选择器
CSS笔记--选择器 mate的使用 <meta charset="UTF-8"> <title>Document</title> <me ...
- HTML+CSS笔记 CSS中级 一些小技巧
水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...
- HTML+CSS笔记 CSS中级 颜色&长度值
颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 语法: p{co ...
- HTML+CSS笔记 CSS中级 缩写入门
盒子模型代码简写 回忆盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左. 语法: margin:10px 15p ...
- HTML+CSS笔记 CSS进阶再续
CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...
- HTML+CSS笔记 CSS进阶续集
元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1&g ...
- HTML+CSS笔记 CSS进阶
文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...
- HTML+CSS笔记 CSS入门续集
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...
- HTML+CSS笔记 CSS入门
简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...
随机推荐
- html框架以及属性字体应用
今日java开课,下午老师讲解了java的第一节课,有关于html的框架,为了自己方便以后也会在日记中添加一些便签方便自己使用. 了解这一些之后老师发布的作业也让我对码代码有了更深的认知,码完作业之后 ...
- python------面向对象进阶 异常处理
一. 异常处理 try: pass except KeyError as e : #注3.x用as ,except KeyError, e ,2.x 用逗号. print("No this ...
- ie 浏览器缓存问题
Get请求在IE会存在缓存问题,最直接的办法 改成Post请求解决
- algernon 基于golang 的独立的支持redis lua pg。。。 的web server
algernon 看到github 的介绍很很强大,一下子想到了openresty,功能看着很强大,支持 redis pg lua markdown quic http2 mysql 限速 pongo ...
- 建筑的永恒之道 (C·亚历山大 著)
永恒之道 建筑或城市只有踏上了永恒之道,才会生机勃勃. 第1章 永恒之道 它是一个唯有我们自己才能带秩序的过程,它不可能被求取,但只要我们顺应它,它便会自然而然地出现. 质 为了探求永恒之道,我们首先 ...
- JDK8安装与配置
如果是免安装包 配置方法 1.配置java环境变量 注意:jdk文件夹名字取名不要用汉语取名. 1)鼠标右键点击我的电脑(计算机)选择属性栏 2)再点击左边高级系统设置 3)点击环境变量 4)在系统变 ...
- SQL 语句 explain 分析
分析索引的效率: > EXPLAIN sql; EXPLAIN 分析的结果的表头如下: id | select_type | table | partitions | type | poss ...
- Metadata in HTML
[本文内容大部分来自MDN中文版:https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML/The_head_m ...
- 【RestTemplete】使用RestTemplete传Json或者 {} 报错--解决
https://jira.spring.io/browse/SPR-9220?focusedCommentId=76760&page=com.atlassian.jira.plugin.sys ...
- 关于分布式uuid的一点设想
在一次公开课上,听别人讲过全局分布式uuid的设计,听过twitter的snowflake的设计.也听过,如果使用单独的计数器服务,不可能每次都保存当前计数器到文本,自己想到应该可以每隔一些数,例如1 ...