并发编程实战1-chap1-2-斗者6星
一、线程安全性
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星的更多相关文章
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 【Java并发编程实战】-----“J.U.C”:Exchanger
前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
- 【Java并发编程实战】-----“J.U.C”:Semaphore
信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析
前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介
注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述.本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的l ...
随机推荐
- PHP游戏概率方法
<?php function createRandomKey($randArr, $rateKey){ $total = 0; $chooseArr = array(); $pow = 0; / ...
- maya cmds pymel undoInfo chunk 撤销束
maya cmds pymel undoInfo chunk 撤销束 cmds.undoInfo(openChunk = 1) # your code cmds.undoInfo(closeChunk ...
- Kali Linux常用服务配置教程获取IP地址
Kali Linux常用服务配置教程获取IP地址 下面以Kali Linux为例,演示获取IP地址的方法 (1)设置网络接口为自动获取IP地址.在Kali Linux的收藏夹中单击图标,将显示所有的程 ...
- win7电脑蓝牙 耳机
== services.msc 然后点击确定. 在服务中我们找到关于蓝牙的设置,双击进入. 将启动类型改成自动或手动,确定后就能使用蓝牙啦. == win7电脑蓝牙耳机 记得之前链接耳机的时候 需要下 ...
- 基于.net的微服务架构下的开发测试环境运维实践
眼下,做互联网应用,最火的架构是微服务,最热的研发管理就是DevOps, 没有之一.微服务.DevOps已经被大量应用,它们已经像传说中的那样,可以无所不能.特来电云平台,通过近两年多的实践,发现完全 ...
- Java 多线程 sleep方法与wait方法的区别
sleep方法会使线程暂停执行一段时间,wait方法会阻塞线程,直到被唤醒或等待时间超时. 两者区别具体如下: 1 原理不同 sleep方法是Thread类的静态方法,使线程暂停执行一段时间,等到计时 ...
- C# ToString()和Convert.ToString()的区别【转】
一.一般用法说明 ToString()是Object的扩展方法,所以都有ToString()方法;而Convert.ToString(param)(其中param参数的数据类型可以是各种基本数据类型, ...
- Java课程课后作业190315之从文档中读取随机数并得到最大连续子数组
从我上一篇随笔中,我们可以得到最大连续子数组. 按照要求,我们需要从TXT文档中读取随机数,那在此之前,我们需要在程序中写入随机数 import java.io.File; import java.i ...
- puppeteer 拦截页面请求
原文链接 https://www.cnblogs.com/ajanuw/p/10324269.html Request Response page.setRequestInterception(tru ...
- ORACLE中通过SQL语句(alter table)来增加、删除、修改字段
1.添加字段: alter table 表名 add (字段 字段类型) [ default '输入默认值'] [null/not null] ; 2.添加备注: comment on ...