一、线程安全性

  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. Swift 使用 日常笔记

    //------------------- var totalPrice: Int = { willSet(newTotalPrice) { //参数使用new+变量名且变量名首地址大写 printl ...

  2. IDEA中添加servlet的jar

    问题解决:办法1:使用Project Structure 方法二:使用Maven 在pom.xml文件中添加如下

  3. 多线程处理list

    package com.zhx.web.invoice.service; import java.util.*; import java.util.concurrent.Callable; impor ...

  4. 解决ubuntu下firefox无法在线播放音频和视频的问题

    原因 Ubuntu 为了规避专利和版权问题,很多东西没有预装,比如音视频解码器AAC. 那么为什么明明 Ubuntu 上没有AAC解码器, Chrome 却可以正常播放呢,自然的想法是 Chrome ...

  5. weblogic 安装部署详解

    0x01 weblogic下载安装 去Oracle官网下载Weblogic 10.3.6,选择Generic版本,各版本选择下载地址:http://www.oracle.com/technetwork ...

  6. Android系统层次解析

    目标:从宏观上解释Android整个系统结构 来源: <Android4高级编程> 目录: 1. Android软件栈结构 一.Android软件栈结构 Android软件栈分为四个结构: ...

  7. github第一次引用开源的库

    想要使用这个一个东西 第一步就是在中添加上面那句话. 这个应该是俩种使用方法,一种用于java中一个用作控件引用 此时就能使用我们引用的这个库了.

  8. 软件分享--EditPlus

    有些人分享的报毒,不好用,所以在这分享个好用的.百度网盘地址: 链接: https://pan.baidu.com/s/15s7I6p0K_36KPtzRDbHfrw 密码:kl5w

  9. vue中路由懒加载实现amd加载文件

    一般我们配置路由的时候是import引入: import log from '@/components/login': { path: '/login', component: log , hidde ...

  10. 关于ico图标

    ico图标可以作为网页标签上显示的小logo,比如: 要获取一个网站的ico图标,只需要在url后输入/favicon.ico即可,比如   https://www.baidu.com/favicon ...