java并发编程实战笔记---(第二章)线程安全:正确性
ThreadA__________ 同步 ______________
异步 ___________ 异步
ThreadB__________ ______________
后台进程 : 程序结束 ,则后台进程随之结束。
多个线程都可能访问,有共享,就要考虑线程安全。
Timer : 开启新线程, timerTask 如果访问程序中的数据,那么该数据的访问需要是线程安全的,简单方法:将线程安全封装在共享数据内部。timer:AtFixed是从上次开始时间算起。不加 AtFixed,若执行时间更长,则是从上次结束时间算起。
Servlet 是单例的,可能被多个线程调用,servlet是共享数据,本身需要线程安全。
(第二章)线程安全:正确性
线程安全类中封装了必要的同步机制,因此客户端无须进一步采取同步措施。
局部变量存在于线程栈,只有执行线程可以访问,状态对象存在于堆中,线程之间可以共享。
线程安全性:多个线程之间的操作无论采用何种执行时序或交替方式,都要保证不变性条件不被破坏。
无状态: 自身不包含域,也不包含对其他类中域的引用。
无状态对象是线程安全的。
2.1原子性
竞态条件:操作时序会影响结果的正确性。
1. 读取--修改--写入
有状态:count
++count : 1.获取count 2.count+1 3.赋值给count
2.先检查后执行 :延迟初始化
3.使用现有的线程安全类:AtomicLong 确保操作的原子性
4. 但是若有多个状态值,尽管是线程安全类,结果也并不一定正确。
要保证状态的一致性,就要在单个原子操作中更新所有相关的状态变量。
2.3加锁机制
1.内置锁
synchronized 同步方法锁:当前对象,静态同步方法 锁:当前类。
同步代码块互斥,只有一个线程可以访问,但是性能就可能低。
2.重入
内置锁是可以重入的。重入意味获取锁的粒度是“线程”,而不是“调用”。
重入的一种实现方法是,为每个锁关联一个获取 计数值和一个所有者线程。
内置锁重入避免了以下线程的死锁。
2.4活跃性和性能
合理处理加锁代码块。
当执行时间较长的计算或者无法快速完成的 操作时(网络io,控制台io),千万不要持有锁。
java并发编程实战笔记---(第二章)线程安全:正确性的更多相关文章
- 《Java并发编程实战》第二章 线程安全性 读书笔记
一.什么是线程安全性 编写线程安全的代码 核心在于要对状态訪问操作进行管理. 共享,可变的状态的訪问 - 前者表示多个线程訪问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与 ...
- java并发编程实战:第二章----线程安全性
一个对象是否需要是线程安全的取决于它是否被多个线程访问. 当多个线程访问同一个可变状态量时如果没有使用正确的同步规则,就有可能出错.解决办法: 不在线程之间共享该变量 将状态变量修改为不可变的 在访问 ...
- 《Java并发编程实战》第二章 线程安全 札记
一个.什么是线程安全 编写线程安全的代码 其核心是管理国事访问的操作. 共享,可变的状态的訪问 - 前者表示多个线程訪问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与其规范 ...
- JAVA并发编程实战笔记 第二章
2.1 线程安全性 当多个线程访问某个类时,不论这些线程如何交替执行,这个类始终都能表现出正确的行为,且主调代码中不需要任何额外的同步或协同,则称这个类是线程安全的. 类不变性条件(Invariant ...
- Java并发编程实战 第8章 线程池的使用
合理的控制线程池的大小: 下面内容来自网络.不过跟作者说的一致.不想自己敲了.留个记录. 要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析: 任务的性质:CPU密集型任务.IO ...
- Java并发编程实战 第2章 线程安全性
编写线程安全的 代码,核心在与对共享的和可变的对象的状态的访问. 如果多个线程访问一个可变的对象时没有使用同步,那么就会出现错误.在这种情况下,有3中方式可以修复这个问题: 不在线程之间共享该状态变量 ...
- 【java并发编程实战】第二章:对象的共享
1.重要的属性 可见性,不变性,原子性 1.1可见性 当一个线程修改某个对象状态的时候,我们希望其他线程也能看到发生后的变化. 在没有同步的情况下,编译器和处理器会对代码的执行顺序进行重排.以提高效率 ...
- Java并发编程实战.笔记十一(非阻塞同步机制)
关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...
- Java并发编程实战---第六章:任务执行
废话开篇 今天开始学习Java并发编程实战,很多大牛都推荐,所以为了能在并发编程的道路上留下点书本上的知识,所以也就有了这篇博文.今天主要学习的是任务执行章节,主要讲了任务执行定义.Executor. ...
- Java并发编程实战 第16章 Java内存模型
什么是内存模型 JMM(Java内存模型)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将对其他线程可见. JMM为程序中所有的操作定义了一个偏序关系,称为Happens-Be ...
随机推荐
- [SHOI2011]双倍回文 manacher
题面: 洛谷:[SHOI2011]双倍回文‘ 题解: 首先有一个性质,本质不同的回文串最多O(n)个. 所以我们可以对于每个i,求出以这个i为结尾的最长回文串,然后以此作为长串,并判断把这个长串从中间 ...
- 【BZOJ4184】shallot(线段树分治,线性基)
[BZOJ4184]shallot(线段树分治,线性基) 题面 权限题啊.....好烦.. Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把 ...
- LCA的倍增算法
LCA,即树上两点之间的公共祖先,求这样一个公共祖先有很多种方法: 暴力向上:O(n) 每次将深度大的点往上移动,直至二者相遇 树剖:O(logn) 在O(2n)预处理重链之后,每次就将深度大的沿重链 ...
- 小Q与内存
Portal --> broken qwq Description (这个描述好像怎么都精简不起来啊qwq) 大概是说你的计算机有1GB的物理内存,按照Byte寻址,其物理地址空间为\(0\si ...
- Subseq
Portal --> broken qwq Description 给你一个长度为\(n\)的整数序列,要支持以下两个操作: \((0,i,x)\):将第\(i\)个数改成\(x\) \((1 ...
- 服务器上的 Git - 在服务器上搭建 Git
http://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E5%9C%A8%E6%9C%8D%E ...
- 011. C++ friend使用
1.friend 友元 将一个函数定义为friend,可以读取private数据: 显然,friend提供便利的同时,会破坏C++的封装性,因此,建议谨慎使用,朋友多了也许是个困扰. class co ...
- VS Code 配置 C/C++ 环境
写作原因 微软的 VSCode 一直以来为人诟病的一个问题就是对于 C/C++ 工程的编译以及调试支持度有限,配置起来比较复杂,但是 vscode-cpptools 团队经过一段时间的 bug 修复之 ...
- (function($){})(jQuery)---Javascript的神级特性:闭包
function($){}实际上是匿名函数 这就定义了一个匿名函数,参数为arg function(arg){ //code } 而调用函数 时,是在函数后面写上括号和实参的,由于操作符的优先级,函数 ...
- LintCode 156: Merge Interval
LintCode 156: Merge Interval 题目描述 给出若干闭合区间,合并所有重叠的部分. 样例 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], ...