《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语言的一种继承. & ...
随机推荐
- day08 学习小测试 九九乘法表 车牌划分计算 大文件读取操作
1.1需求:读取一个100G的文件,检测文件中是否有关键字keys=['苍老师','小泽老师',"alex"], 如果有则替换成"***",并写入到另一个文件中 ...
- Redis无法启动
我的原因是:没有足够的可用空间 以往双击redis-server.exe就可以启动,但突然启动不了,只是弹出控制台一闪而过,之后就自动关闭了, 因为没看到具体错误,百度了下关键字”Redis无法启动“ ...
- mac os high sierra下搭建php多版本-php5.2+php5.6-nginx
xampp的apache彻底启动不来了. php52的编译参数 ./configure --prefix=/usr/local/Cellar/php52bysk/ --with-config-file ...
- htm5-websocket实现数据查询应用
htm5-websocket实现数据查询应用 在之前的文章讲述了使用Websocket调用远程方式的功能,在这基础我们可以简单地使用WebSocket进行数据处理方面的应用;只需要在方法执行相关的 ...
- forward reference前向引用,gloal values and local values全局变量和局部变量,recursive function递归函数
1.全局变量与局部变量练习 1 # -*- coding: UTF-8 -*- 2 def bar(): 3 print('from bar') 4 def foo(): 5 print('from ...
- linux git 保存用户名和密码
一.通过文件方式 1.在~/下, touch创建文件 .git-credentials, 用vim编辑此文件,输入内容格式: touch .git-credentials vim .git-crede ...
- maven打包时报错:-source 1.5 中不支持 diamond 运算符
报错现象: 解决方法: 在pom文件中加入下面依赖 <build> <plugins> <plugin> <groupId>org.apache.mav ...
- Kafka 如何读取offset topic内容 (__consumer_offsets)(转发)
原文 https://www.cnblogs.com/huxi2b/p/6061110.html 众所周知,由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka已推荐将consumer ...
- C++Primer第五版——习题答案详解(八)
习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第9章 顺序容器 练习9.1 a.list,需要按字典序插入,可能插入位置在中间 b.d ...
- UE4 UMG
转自:https://www.cnblogs.com/kadaj/p/6412937.html 1.创建关卡类 1.创建C++类继承LevelScriptActor 2.打开关卡蓝图 Class Se ...