并发编程实战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 ...
随机推荐
- git 回滚远程服务端master的代码
1.先备份版本 git checkout master git pull git branch master_backup //备份一下这个分支当前的情况 git push origin master ...
- git本地项目上传至码云gitee
如果你的本机是安装成功第一次使用,先配置一下一些基本的信息 $ git config--global user.name "Your Name" $ git config --gl ...
- Linux awk学习
零.awk标准语法 [root@wohaoshuai1 bbb]# echo "abcd" |awk 'BEGIN{print "wohaoshuai"} /a ...
- 如何使用JMeter开源性能测试工具来构建Web性能测试体系
一.性能测试一些概念 性能测试:就是通过自动化的测试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行测试.负载测试和压力测试都属于性能测试,两者可以结合进行. 负载测试:确定在各种工作负载 ...
- PID实战-STM32电机PWM力矩调节系统
系统阐述:
- c#堆与栈
一.在讲堆栈之前,我们先看看值类型和引用类型: 1,我们看看值类型与引用类型的存储方式: 引用类型:引用类型存储在堆中.类型实例化的时候,会在堆中开辟一部分空间存储类的实例.类对象的引用还是存储在栈中 ...
- django-request对象
HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,关于更多的相关知识,可以阅读<HTTP权威指南>获得. 其中 请求报文 由客户端发送,其中包含和许多的信息,而 django 将 ...
- java自动化-junit框架简述
本人使用的是java的junit框架来组织的自动化测试,故我这边需要简单介绍一下junit框架 首先,建议自行百度一下junit框架,先有一个大概的了解 所谓的接口自动化测试,会对多个接口中每一个接口 ...
- js一些代码
1判断金额正则 var reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/; var money ...
- 如何根据checkbox的值进行勾选!例:我要勾选value等于scanbuy,terminal的复选框!
微商城 随手购 自助购 <div class="controls" id="client"> <input id="mall&quo ...