Java 并发 – 线程安全?
线程安全的定义常常让人迷惑,搜索引擎会发现无数定义,比如:
- 多个线程同时执行也能正确工作就是线程安全的代码
 - 多个线程同时执行能以正确的方式操纵共享数据就是线程安全的代码。
 
而且还有很多类似的定义
你是否认为这种定义实际上没有任何意义而且还让人更加迷惑?虽然这些定义没错,但事实是他们没有提供任何实际的帮助或观点。我们如何区分线程安全类和不安全类?我们所谓的“安全”是什么意思?
线程安全的正确性是什么?
线程安全的任何合理定义的核心是正确性的概念。因此,在了解线程安全之前,我们首先应该理解这个“正确”。
正确性意味着一个类符合它的规范。
一个好的类规范将在任何给定的时间拥有关于一个类的状态的所有信息,在其上执行某些操作以及它的后置条件。但我们经常没有为我们的类写出足够的规范,我们怎么可能知道它们能正确的使用呢?我们不能,但这并不能阻止我们使用它们,一旦我们说服自己“代码有效”。这种“代码自信”来自于我们接近正确。
乐观地将“正确性”定义为可以被识别的东西,现在我们可以用一种不那么绕的方式定义线程安全:当一个类在从多个线程访问时继续正常运行时,它是线程安全的。
不管运行时环境线程调度如何交织,只有当从多个线程访问它行为正确,以及调用代码的部分没有额外的同步或其他协调,那么这个类是线程安全的
如果这个宽泛的“正确性”让你觉得比较烦,那么您可能会认为线程安全类是一个在并发环境中比单线程环境中更糟的类。线程安全类封装了所需的同步,这样客户端就不必提供自己的同步。
示例:无状态servlet
线程安全类的一个很好的例子是java servlet没有字段(fields)和引用(references),没有来自别的类的字段,它们是无状态的。
public class StatelessFactorizer implements Servlet
{
public void service(ServletRequest req, ServletResponse resp)
{
BigInteger i = extractFromRequest(req);
BigInteger[] factors = factor(i);
encodeIntoResponse(resp, factors);
}
}
在特定计算瞬间数据仅存储在正在在执行线程的堆栈上,即局部变量。一个线程访问一个statelessfactorizer不会影响另一个线程访问同一个statelessfactorizer产生的结果;因为两个线程不共享状态,就好像他们访问不同的实例。由于某个线程对无状态对象的的访问操作不会影响其他线程中操作的正确性,无状态对象是线程安全的。
这就是围绕线程安全的这个小而重要的概念
Happy Learning !!
Java 并发 – 线程安全?的更多相关文章
- Java 并发 线程同步
		
Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大 ...
 - Java 并发 线程的优先级
		
Java 并发 线程的优先级 @author ixenos 低优先级线程的执行时刻 1.在任意时刻,当有多个线程处于可运行状态时,运行系统总是挑选一个优先级最高的线程执行,只有当线程停止.退出或者由于 ...
 - Java 并发 线程属性
		
Java 并发 线程属性 @author ixenos 线程优先级 1.每当线程调度器有机会选择新线程时,首先选择具有较高优先级的线程 2.默认情况下,一个线程继承它的父线程的优先级 当在一个运行的线 ...
 - Java 并发 线程的生命周期
		
Java 并发 线程的生命周期 @author ixenos 线程的生命周期 线程状态: a) New 新建 b) Runnable 可运行 c) Running 运行 (调用 ...
 - Java并发——线程安全、线程同步、线程通信
		
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
 - 从JDK源码角度看java并发线程的中断
		
线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止.在java中要让线程安全.快速.可靠 ...
 - Java并发——线程介绍
		
前言: 互联网时代已经发展到了现在.从以前只考虑小流量到现在不得不去考虑高并发的问题.扯到了高并发的问题就要扯到线程的问题.你是否问过自己,你真正了解线程吗?还是你只知道一些其他博客里写的使用方法.下 ...
 - java并发线程池---了解ThreadPoolExecutor就够了
		
总结:线程池的特点是,在线程的数量=corePoolSize后,仅任务队列满了之后,才会从任务队列中取出一个任务,然后构造一个新的线程,循环往复直到线程数量达到maximumPoolSize执行拒绝策 ...
 - java 并发——线程
		
一.前言 前一篇文章总结了对 java 并发中的内置锁的理解,这篇文章来说说线程 ,并发与线程总有剪不断理还乱的关系.关于 java 线程的基本概念.线程与进程的关系以及如何创建线程,想必大家都很清楚 ...
 - Java并发--线程池的使用
		
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
 
随机推荐
- PHP count() 函数
			
count() 函数计算数组中的单元数目或对象中的属性个数. 对于数组,返回其元素的个数,对于其他值,返回 1.如果参数是变量而变量没有定义,则返回 0.如果 mode 被设置为 COUNT_RECU ...
 - 解决IE无法访问localhost问题
			
前几天新安装了win10和webstorm16,发现系统是的IE浏览器是IE11,调试时无法正常显示网页: 一开始以为是系统没有写入密钥,无法获得权限,查了一下后发现是局域网设置不正确. 作以下设置可 ...
 - hdu2389二分图之Hopcroft Karp算法
			
You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
 - 利刃 MVVMLight 8:DispatchHelper在多线程和调度中的使用
			
在应用程序中,线程可以被看做是应用程序的一个较小的执行单位.每个应用程序都至少拥有一个线程,我们称为主线程,这是在启动时调用应用程序的主方法时由操作系统分配启动的线程. 当调用和操作主线程的时候,该操 ...
 - 一个使用openGL渲染的炫丽Android动画库
			
android-magic-surface-view 这是一个 android 动画特效库, 可以实现各种炫酷动画. github地址: https://github.com/gplibs/andro ...
 - Lucene5.5.4入门以及基于Lucene实现博客搜索功能
			
前言 一直以来个人博客的搜索功能很蹩脚,只是自己简单用数据库的like %keyword%来实现的,所以导致经常搜不到想要找的内容,而且高亮显示.摘要截取等也不好实现,所以决定采用Lucene改写博客 ...
 - hdu4597 Play Game  DP
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 感觉很不错的区间DP,又做了一遍,感觉自己对边界的处理还是很欠缺 代码: #include< ...
 - 区划代码 node 版爬虫尝试
			
前言 对于区划代码数据,很多人都不会陌生,大多公司数据库都会维护一份区划代码,包含省市区等数据.区划信息跟用户信息息息相关,往往由于历史原因很多数据都是比较老的数据,且不会轻易更改.网上也有很多人提供 ...
 - JAVA进程占用CPU分析
			
在一次生产环境中,服务器负载报警,SSH登录上看到CPU占用很高. 1.执行top命令,看到进程号为9737的进程持续占用CPU 2.怀疑是否是进程配置的内存不够了,引发了fullGC导致CPU占用高 ...
 - [开源] 基于ABP,Hangfire的开源Sharepoint文件同步程序----SuperRocket.SPSync
			
(一)项目背景 Sharepoint是微软的一个产品,很多公司都在使用它,也有很多公司以前使用它,现在可能需要移植到别的平台,也可能只是移植其中的文件存储,比如说移植到微软云,或者亚马逊云存储.Sup ...