首页 / JAVA / JAVA并发编程之线程安全性
JAVA并发编程之线程安全性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA并发编程之线程安全性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2240字,纯文字阅读大概需要4分钟。
内容图文
![JAVA并发编程之线程安全性](/upload/InfoBanner/zyjiaocheng/641/978d605e9fa24da8b684c68728d14025.jpg)
1、一个对象是否是线程安全的,取决于它是否被多个线程访问。想要使得线程安全,需要通过同步机制来协同对对象可变状态的访问。
2、修复多线程访问可变状态变量出现的错误:1、程序间不共享状态变量 2、状态变量修改为不可变 3、使用同步
3、无状态的对象一定是线程安全的,一个类中如果没有包含任何域及其他类域的引用,则这个类是个无状态的类,类的对象是无状态对象。
4、线程安全下的一些概念:
1、在并发编程中,如果一个包含状态的对象,在执行过程中操作不具备原子性,则会使此变量发生偏差。
2、在并发编程中,如果一个包含状态的对象,在操作过程中存在多个竞态条件,结果会变不可靠。因为后执行的操作,可能会基于前一个操作的状态去执行某个操作,但前一个操作的结果可能会失效,导致后一个操作从全局看是错误的,这叫做先检查后执行错误。
3、复合操作:先检查后执行;读取-修改-写入
4、加锁机制
5、内置锁:同步代码块包括两部分:一个作为锁的对象引用,另一个作为锁保护的代码块。Java内置锁相当于一个互斥锁。
6、重入锁:指如果某个线程已经获取了某个锁,在流程处理过程中,又重新去获取这个锁,则将会成功。
7、用锁来保护状态:由于锁能达到代码路径以串行执行,因此可以通过锁来构造一些协议,实现对共享状态的独占访问,遵循这些协议,则可达到状态一致性目的。避免产生竞态条件:原子操作,比如命中计数器的复合操作或者延迟初始化操作都需要是原子性的。如果在复合操作过程中持有一个锁,则复合操作会变成一个原子操作。但仅仅将复合操作封装到一个同步代码块中是不够的,需要在访问某个变量的所有位置上都使用同步,都使用同一个锁。
对于可能被多个线程同时访问的可变状态变量,在访问时需要同一个锁,这个变量就是被这个锁保护的。
每个对象虽然可以通过一个内置锁受到保护,但这种锁并不能阻止其他线程去访问这个对象,因为某个线程在获得这个对象的锁以后,并不能阻止的是其它线程去获得这个锁,想要对象中的共享状态变量安全,需要自行构造加锁协议或者同步策略,在程序中要自始至终的使用这个策略。
以上的意思是:如果某个对象中的复合操作或者延迟操作想要得到线程安全保护,那么只在这个对象的这些操作上进行内置锁保护是不够的,因为其他线程也会去访问这个对象的共享变量,如果访问的获取操作或者修改操作,那么这个共享变量就变得不安全,怎么达到共享安全呢,需要在这个共享变量的操作上全部使用锁或者不同的策略,这样不管执行什么操作,都是安全的。
还有,如果我们能达到在访问某个共享状态变量时候,都需要持有同一个锁才能访问这个共享状态变量,那么也能达到线程安全,这种安全是建立在这个锁保护的基础上。
内容总结
以上是互联网集市为您收集整理的JAVA并发编程之线程安全性全部内容,希望文章能够帮你解决JAVA并发编程之线程安全性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。