一、线程安全性

  1.线程安全关注点:对共享的和可变的状态的访问

  2.JAVA同步机制:synchronized、volatile、显示锁、原子变量

  3.无状态对象一定是线程安全的:不包含任何域,也不包含任何对其他类中域的引用,计算过程中的临时状态仅存在于线程栈上的局部变量,并且只能由正在执行的线程访问

  4.竞态条件本质:基于一种可能失效的结果做出判断或者执行某个计算,如先检查后执行、延迟初始化

  5.java.util.concurrent包中原子变量类

  6.要保持状态一致性:需要在单个原子操作中,更新所有相关的状态变量

  7.重入:取锁的操作粒度是线程,而不是调用,意味着同一个线程可以获得由自己持有的锁,可以避免子类方法调用基类方法执行中的死锁

  8.如果用同步来协调对某个变量的访问,那么在访问这个变量的所有位置都需要使用同步;当使用锁来协调对某个变量的访问时,在访问变量的所有位置都要使用同一个锁。

  9.对于每个包含多个变量的不变性条件,其中涉及的所有变量都需要由同一个锁来保护。

  10.即使类的每个操作均保证了原子性,但是将多个操作合并为一个复合操作,还是需要额外的加锁机制

  11.对方法使用synchronized会比较重载,可以选择对可能存在竞态条件的代码块使用synchronized关键字

二、对象的共享

  1.同步代码块的两层语义

  • 可以确保以原子的方式执行操作
  • 保证内存可见性,即当一个线程修改了对象状态后,其他线程能看到发生的状态变化,如果某线程修改了共享变量,如果未使用正确的同步,其他线程很可能看不到状态变化

  2.get和set方法均需要使用同步,虽然get方法不会修改共享变量的值,但是可以保证可见性

  3.最低安全性:能看到变量值为之前某个线程设置的值,而不是随机值

  4.volatile变量:会直接操作主内存,而非工作内存,访问volatile变量不会加锁,也就不会使线程阻塞,因此比synchronized更轻量级

  • 编译器与运行时都会注意到这个变量是共享的,因此不会将变量上的操作与其他内存操作一起重排序
  • volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量总会返回最新写入的值
  • 写入volatile变量相当于退出同步代码块,读取volatile变量相当于进入同步代码块
  • volatile变量无法保证++操作的原子性,所以具体操作仍然要使用同步,原子变量可以提供”读-改-写“的原子操作

  5.发布:使对象能够在当前作用域之外的代码中使用,发布一个对象时,该对象的非私有域中的引用的所有对象同样会被发布。

  6.逸出:当某个不应该发布的对象被发布时

  7.线程封闭:仅在单线程内访问数据,就不需要同步,如JDBC连接池的使用

  1)Ad-hoc线程封闭:维护线程封闭的职责完全由程序实现来承担

并发编程实战1-chap1-2-斗者6星的更多相关文章

  1. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  2. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  3. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  4. 【Java并发编程实战】-----“J.U.C”:Exchanger

    前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...

  5. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  6. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  7. 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock

    ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...

  8. 【Java并发编程实战】-----“J.U.C”:Semaphore

    信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...

  9. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析

    前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...

  10. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介

    注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述.本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的l ...

随机推荐

  1. git配置公钥

    1.在linux的命令行下,或者是windows上Git Bash命令行窗口中键入: ssh-keygen -t rsa -C "gitee.com" 2..一直按回车(Enter ...

  2. 转载博文: Py西游攻关之IO model

    Py西游攻关之IO model 转载:https://www.cnblogs.com/yuanchenqi/articles/5722574.html 事件驱动模型 上节的问题: 协程:遇到IO操作就 ...

  3. python基础一 ------排序和查找算法

    插入排序; 假设数组长度为n,先从第二个元素开始,与前一个元素比较,之后将较小的元素    放在前面,现在前两个元素是有顺序的,这时取第三个元素,与前一个元素(也就是第二个)比较,较小的放在前面   ...

  4. 11 安装已集成HA的树莓派镜像Hassbian

    2017-09-04 10:40:47 下载Hassbian镜像文件,浏览https://github.com/home-assistant/pi-gen/releases/tag/v1.23,查看最 ...

  5. Telephone Lines [POJ3662] [二分答案]

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  6. MVC中EF代码优先问题

    在练习Mvc项目时,提示如下数据库错误: The model backing the 'EFDbContext' context has changed since the database was ...

  7. HTML入门3

    HTML主要工作在于编辑文本结构和文本内容,也称语义(semantics)以便能够再浏览器正确地显示,下面开始介绍在文本中添加标题,段落,强调语句,创建列表等等 基础:标题和段落 内容结构化会使得阅读 ...

  8. 版本管理_git

    git 世界上最好的版本管理工具,分布式版本控制系统. 林纳斯-托瓦斯,自由主义教皇(git.linux) git 不管理空文件夹 对比于 SVN mkdir XX        创建一个空目录 XX ...

  9. linux学习:文件处理相关命令用法整理(正则表达式)

    指令:ls.cat.du.rename.dirname.basename.sort.diff.seq.head.tail.tree.chmod.cut.paster.正则 一:统计文件大小,行数,字符 ...

  10. java 实现文件上传下载以及查看

    项目的目录结构 代码  IOUtils.java package cn.edu.zyt.util; import java.io.IOException; import java.io.InputSt ...