《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并发编程实战》笔记的更多相关文章

  1. HTML+CSS笔记 CSS笔记集合

    HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...

  2. CSS笔记--选择器

    CSS笔记--选择器 mate的使用 <meta charset="UTF-8"> <title>Document</title> <me ...

  3. HTML+CSS笔记 CSS中级 一些小技巧

    水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...

  4. HTML+CSS笔记 CSS中级 颜色&长度值

    颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 语法: p{co ...

  5. HTML+CSS笔记 CSS中级 缩写入门

    盒子模型代码简写 回忆盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左. 语法: margin:10px 15p ...

  6. HTML+CSS笔记 CSS进阶再续

    CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...

  7. HTML+CSS笔记 CSS进阶续集

    元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1&g ...

  8. HTML+CSS笔记 CSS进阶

    文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...

  9. HTML+CSS笔记 CSS入门续集

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...

  10. HTML+CSS笔记 CSS入门

    简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...

随机推荐

  1. 学习笔记TF023:下载、缓存、属性字典、惰性属性、覆盖数据流图、资源

    确保目录结构存在.每次创建文件,确保父目录已经存在.确保指定路径全部或部分目录已经存在.创建沿指定路径上不存在目录. 下载函数,如果文件名未指定,从URL解析.下载文件,返回本地文件系统文件名.如果文 ...

  2. freebsd安装python2

    第一步  cd /usr/ports/lang/python27 第二步 输入以下命令(需要联网) make make install 到此如果输入python无效   继续 第三步 cd /usr/ ...

  3. 小程序通过background-image设置背景图片

    微信小程序通过background-image设置背景:只支持线上图片和base64图片,不支持本地图片:base64图片设置步骤如下: 1.在网站http://imgbase64.duoshiton ...

  4. redis 的备份策略,最好使用:RDB-AOF 混合持久化

    相关资料: Redis 4.0 新功能简介:RDB-AOF 混合持久化:http://blog.huangz.me/2017/redis-rdb-aof-mixed-persistence.html ...

  5. linux nodejs

    scp node-v8.15.0-linux-x64.tar.gz root@10.88.248.231:/lngoa tar -zxvf node-v8.15.0-linux-x64.tar.gz ...

  6. 廖雪峰Java7处理日期和时间-1概念-1日期和时间

    1.日期 日期是指某一天,如2016-11-20,2018-1-1 2.时间有2种: 不带日期的时间:14:23:54 带日期的时间:2017-1-1 20:21:23,唯一确定某个时刻 3.时区 时 ...

  7. [UE4]Window Title Bar Area

    一.Window Title Bar Area.windows窗口拖拽控件 二.window Buttons Enabled,在控件的右上角显示:最小化.最大化,关闭按钮; Toggle Fullsc ...

  8. ps-如何去水印

    现在,版权意识越来越明显了,所以加水印的图片越来越多了,但我们在一些特定的情况又不得不去使用那些图片,去水印又是问题.今天,我来说下如何去水印. 一.ps-仿制图章工具去水印 1.打开ps,打开待去水 ...

  9. mybatis的动态sql编写以及一对一关系查询和一对多的查询

    创建mybatis数据库,运行以下sql语句 /* SQLyog Ultimate v8.32 MySQL - 5.5.27 : Database - mybatis **************** ...

  10. WordPress版微信小程序2.4版发布

    自从发布2017年9月16日WordPress版微信小程序2.2.8版本后,这个一个多月来,WordPress版微信小程序,在经过一些比较小的更新后,今天发布阶段性的版本:2.4版 .这版本主要是功能 ...