java并发编程实战之线程安全性(一)
1.1什么是线程安全性
要对线程安全性给出一个确切的定义是非常复杂的。最核心的概念就是正确性。正确性:某个类的行为与其规范完全一致。在良好的规范中通常会定义各种不变性条件来约束对象的状态,以及定义各种后验条件来描述对象操作的结果。
由于我们通常定义一个类的时候不会编写详细的规范,因此我们可以把单线程的正确性近似定义为:可见即所知。对于正确性有了较为清晰的定义后,就可以定义线程安全性:当多个线程访问某个类时(不管运行时环境采用何种调度方式或者这些线程如何交替执行,并且
在主调代码中不需要任何额外的同步或协同),这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。
实例:一个无状态的servlet
无状态的:它既不包含任何域,也不包含任何对其他类中域的引用。计算过程中的临时状态仅存于线程栈上的局部变量,并且只能由正在执行的线程访问。 无状态对象一定是线程安全的,大多数servlet都是无状态的
1.2 原子性
在并发编程中:由于不恰当的执行时序而出现不正确的结果是一种非常重要的结果,它有一个正式的名字:竞态条件(Race condition)
1.2.1 竞态条件:
最常见的竞态条件类型就是先检查后执行,通过一个可能失效的观测结果来决定下一步动作。使用先检查后执行的一种常见情况就是延迟初始化,延迟初始化的目的就是将对象初始化操作推迟到实际被使用时才进行,同时保证只被初始化一次。
实际情况中,应尽可能地使用现有的线程安全对象(例如acomiclong)来管瘤类的状态。与非线程相比,判断线程安全对象的可能状态及其状态转换情况要更为容易,从而也更容易维护和验证线程安全性。
1.3 加锁机制
要保持状态的一致性,就需要在单子原子操作中更新所有相关的状态变量
1.3.1 内置锁
Java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block) 同步代码块包含了俩部分:一个是作为锁的对象引用,一盒作为由这个锁保护的代码块。以关键字synchronized来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象,静态的synchronized 方法以class对象作为锁
synchronized(lock){
//访问或者修改由锁保护的共享状态
}
每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或者监视器锁,线程在进入同步代码块的时候会自动获取锁,并且在退出同步代码块的时候会自动释放锁,而无论是通过正常的控制路径退出,还是通过从代码块中异常退出,获取内置锁的唯一途径就是进入由锁保护的同步代码块或方法。
Java的内置锁相当于一种互斥体(互斥锁),这意味着最多只要有一个线程能持有这种锁,有些场景并发性不是很好。
1.3.2 重入
当某个线程请求一个一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁是可以重入的,因此如果某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功,重入意味着获取锁的操作的粒度是线程,而不是调用。重入的一种实现方式是,为每个锁关联一个获取技术值和所有者线程,计数值为0的时候表示该锁没有被持有 计数值可以累加 退出时会累减。
2.4 用锁来保护状态
一种常见的错误是认为,只有在写入共享变量时才需要使用同步,然而事实并非如此。对于可能被多个线程同时访问的可变状态变量,在访问它时都需要持有同一个锁,在这种情况下,我们称状态变量是由这个锁保护的。
一种常见的加锁约定是,将所有的可变状态都封装在对象内部,并通过对象的内置锁对所有的访问可变状态的代码路径进行同步,使得在该对象上不会发生并发访问。在许多线程安全类都使用了这种模式,
2.5活跃性与性能
通常,在简单性与性能之间存在相互制约的因素,不能盲目为了性能而牺牲简单性,因为可能破坏安全性,当执行时间较长的计算或者可能无法快速完成的操作时,一定不要持有锁,例如网络IO或者控制台IO
java并发编程实战之线程安全性(一)的更多相关文章
- Java并发编程实战 之 线程安全性
1.什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何种调用方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全 ...
- 【java并发编程实战】-----线程基本概念
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...
- Java并发编程实战 05等待-通知机制和活跃性问题
Java并发编程系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 Java并发编程实战 03互斥锁 解决原子性问题 Java并发编程实 ...
- java并发编程实战学习(3)--基础构建模块
转自:java并发编程实战 5.3阻塞队列和生产者-消费者模式 BlockingQueue阻塞队列提供可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put ...
- 《Java并发编程实战》/童云兰译【PDF】下载
<Java并发编程实战>/童云兰译[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062521 内容简介 本书深入浅出地介绍了Jav ...
- 《java并发编程实战》笔记
<java并发编程实战>这本书配合并发编程网中的并发系列文章一起看,效果会好很多. 并发系列的文章链接为: Java并发性和多线程介绍目录 建议: <java并发编程实战>第 ...
- 《Java并发编程实战》文摘
更新时间:2017-06-03 <Java并发编程实战>文摘,有兴趣的朋友可以买本纸质书仔细研究下. 一 线程安全性 1.1 什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何 ...
- Java并发编程实战 04死锁了怎么办?
Java并发编程文章系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 Java并发编程实战 03互斥锁 解决原子性问题 前提 在第三篇 ...
- Java并发编程实战——读后感
未完待续. 阅读帮助 本文运用<如何阅读一本书>的学习方法进行学习. P15 表示对于书的第15页. Java并发编程实战简称为并发书或者该书之类的. 熟能生巧,不断地去理解,就像欣赏一部 ...
随机推荐
- vue-router的几种用法
1.全局路由守卫 router.beforeEach((to, from, next) => { // ... }) 当一个导航触发时,全局前置守卫按照创建顺序调用.守卫是异步解析执行,此时导航 ...
- 逆向工程初步160个crackme-------7
这两天有点发烧,被这个疫情搞得人心惶惶的.我们这里是小镇平常过年的时候人来人往的,今年就显得格外的冷清.这是老天帮让在家学习啊,破解完这个crackme明天就去接着看我的加密解密,算了算没几天就开学了 ...
- Java 并发编程(一) → LockSupport 详解
开心一刻 今天突然收到花呗推送的消息,说下个月 9 号需要还款多少钱 我就纳了闷了,我很长时间没用花呗了,怎么会欠花呗钱? 后面我一想,儿子这几天玩了我手机,是不是他偷摸用了我的花呗 于是我找到儿子问 ...
- 各大搜索引擎 User-Agent
百度PC User-Agent Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider ...
- cmake和make
学计算机的,在写代码的时候,IDE安装好,环境按着教程配置好,就直接代码了,编辑器的具体原理只是一知半解,现在来系统学习一下,为了方便以后学习HElib! make和cmake 写程序大体步骤为: 1 ...
- 笔记本用HDMI转VGA 使用双屏办公 听语音
笔记本用HDMI转VGA 使用双屏办公 听语音 原创 | 浏览:1212 | 更新:2019-11-12 12:16 1 2 3 4 5 6 7 分步阅读 笔记本使用 转接头扩展出一块屏幕.使用多屏办 ...
- Linux权限问题(1)-Sticky
背景:朋友在使用php进行mv操作时,出现了权限被拒绝的问题.查看之后,发现目录设置了sticky权限,取消此权限后,文件可以正常mv及删除. Sticky:对于一个多人可写的目录,如果设置了stic ...
- 强哥HTML学习笔记
html 浏览器的选择:1.火狐2.ie3.chrome4.mac5.opera 安装两款插件:1.firebug2.web develope html页面元素:1.doctype2.htmlhead ...
- 选择“保留window设置、个人文件及应用”或者“升级安装windows并保留文件设置和应用程序”的 处理干净以后用ghost备份
个人经验 第一次装好以后 把所有常用软件什么的 还有系统的更新全部装好 删去乱七八糟的临时文件啊什么的 处理干净以后用ghost备份下次需要重装直接从ghost镜像恢复 然后更新软件 打补丁 再备份 ...
- Mysql 官网下载二进制包_图解步骤
MYSQL下载方式 下载二进制包,直接使用wget下载 [root@db ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mys ...