- 浏览: 602654 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (199)
- 纯java (22)
- 中间件 (1)
- java线程 (1)
- webwork (10)
- HTML/CSS (11)
- struts2 (10)
- mysql (14)
- Linux (8)
- 字符编码和转换 (1)
- WebService (1)
- web (21)
- javascript (33)
- ajax (5)
- 随便写写 (3)
- svn (0)
- eclipse使用技巧 (10)
- Ant (1)
- 互联网发展方向 (1)
- Jquery (12)
- 视频 (2)
- MD5 (1)
- 项目经验总结 (1)
- Oracle (2)
- Netbeans (1)
- Apache/Tomcat (4)
- springside (1)
- hibernate (6)
- SpringSecurity (0)
- java与文件 (1)
- CKEditor (4)
- JSON (3)
- 笔试题 (0)
- 应用部署 (1)
- 杂七杂八 (1)
- android (1)
- jQuery UI (1)
- XML相关技术 (1)
- HTML5 (1)
- CSS3 (0)
- 正则表达式 (1)
- http协议 (3)
- 算法 (5)
- 互联网知识 (1)
最新评论
-
hp321:
我现在遇到一个开发自定义按钮的问题,想请教下你:问题如下:举例 ...
Ckeditor 如何在源码模式下添加可以显现的按钮 -
make1828:
javascript跨域解决方案(一) -
huxianwen:
问题是, ckeditor编辑器在源码模式并不能插入任何代码呀 ...
Ckeditor 如何在源码模式下添加可以显现的按钮 -
nidonglin1986:
虽然解决了问题,但是原因说的不是很明白啊。中文跟HTML标志 ...
struts2的标签在JS中的使用 中文乱码 -
ldw1986hf123:
[*]
JVM工作原理
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。 比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。 在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1; 而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。 那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 3。这就是“线程不安全”了。 类要成为线程安全的,首先必须在单线程环境中有正确的行为。如果一个类实现正确(这是说它符合规格说明的另一种方式),那么没有一种对这个类的对象的操作序列(读或者写公共字段以及调用公共方法)可以让对象处于无效状态,观察到对象处于无效状态、或者违反类的任何不可变量、前置条件或者后置条件的情况。 此外,一个类要成为线程安全的,在被多个线程访问时,不管运行时环境执行这些线程有什么样的时序安排或者交错,它必须仍然有如上所述的正确行为,并且在调用的代码中没有任何额外的同步。其效果就是,在所有线程看来,对于线程安全对象的操作是以固定的、全局一致的顺序发生的。 正确性与线程安全性之间的关系非常类似于在描述 ACID(原子性、一致性、独立性和持久性)事务时使用的一致性与独立性之间的关系:从特定线程的角度看,由不同线程所执行的对象操作是先后(虽然顺序不定)而不是并行执行的。 线程安全性不是一个非真即假的命题。 Vector 的方法都是同步的,并且 Vector 明确地设计为在多线程环境中工作。但是它的线程安全性是有限制的,即在某些方法之间有状态依赖(类似地,如果在迭代过程中 Vector 被其他线程修改,那么由 Vector.iterator() 返回的 iterator会抛出ConcurrentModifiicationException)。 对于 Java 类中常见的线程安全性级别,没有一种分类系统可被广泛接受,不过重要的是在编写类时尽量记录下它们的线程安全行为。 Bloch 给出了描述五类线程安全性的分类方法:不可变、线程安全、有条件线程安全、线程兼容和线程对立。只要明确地记录下线程安全特性,那么您是否使用这种系统都没关系。这种系统有其局限性 -- 各类之间的界线不是百分之百地明确,而且有些情况它没照顾到 -- 但是这套系统是一个很好的起点。这种分类系统的核心是调用者是否可以或者必须用外部同步包围操作(或者一系列操作)。下面几节分别描述了线程安全性的这五种类别。 不可变的对象一定是线程安全的,并且永远也不需要额外的同步[1]。因为一个不可变的对象只要构建正确,其外部可见状态永远也不会改变,永远也不会看到它处于不一致的状态。Java 类库中大多数基本数值类如 Integer 、 String 和 BigInteger 都是不可变的。 线程安全的对象具有在上面“线程安全”一节中描述的属性 -- 由类的规格说明所规定的约束在对象被多个线程访问时仍然有效,不管运行时环境如何排列,线程都不需要任何额外的同步。这种线程安全性保证是很严格的 -- 许多类,如 Hashtable 或者 Vector 都不能满足这种严格的定义。 有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。条件线程安全的最常见的例子是遍历由 Hashtable 或者 Vector 或者返回的迭代器 -- 由这些类返回的 fail-fast 迭代器假定在迭代器进行遍历的时候底层集合不会有变化。为了保证其他线程不会在遍历的时候改变集合,进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常,独占性的访问是由对锁的同步保证的 -- 并且类的文档应该说明是哪个锁(通常是对象的内部监视器(intrinsic monitor))。 如果对一个有条件线程安全类进行记录,那么您应该不仅要记录它是有条件线程安全的,而且还要记录必须防止哪些操作序列的并发访问。用户可以合理地假设其他操作序列不需要任何额外的同步。 线程兼容类不是线程安全的,但是可以通过正确使用同步而在并发环境中安全地使用。这可能意味着用一个 synchronized 块包围每一个方法调用,或者创建一个包装器对象,其中每一个方法都是同步的(就像 Collections.synchronizedList() 一样)。也可能意味着用 synchronized 块包围某些操作序列。为了最大程度地利用线程兼容类,如果所有调用都使用同一个块,那么就不应该要求调用者对该块同步。这样做会使线程兼容的对象作为变量实例包含在其他线程安全的对象中,从而可以利用其所有者对象的同步。 许多常见的类是线程兼容的,如集合类 ArrayList 和 HashMap 、 java.text.SimpleDateFormat 、或者 JDBC 类 Connection 和 ResultSet 。 线程对立类是那些不管是否调用了外部同步都不能在并发使用时安全地呈现的类。线程对立很少见,当类修改静态数据,而静态数据会影响在其他线程中执行的其他类的行为,这时通常会出现线程对立。线程对立类的一个例子是调用 System.setOut() 的类。
什么是线程安全?
举例
线程安全性
线程安全程度(了解)
不可变
线程安全
有条件的线程安全
线程兼容
线程对立
发表评论
-
java中的hashcode
2011-11-28 11:03 958Java中有两类集合(Collection),一类是List, ... -
插入排序算法
2011-11-15 16:35 1101插入排序 Insertion Sort ... -
任意10进制的数,然后打印其2进制形式的时候里面包含多少个1
2011-11-15 15:36 1232具体做法有两种: 方法一: public class A{ ... -
交换两个数不使用第三方变量
2011-11-15 14:04 1533题目很简单:------------------------- ... -
Java 冒泡排序
2011-11-15 11:05 1177冒泡的思想精髓就是数组中相临的两个数依次相比较,如果左边的数小 ... -
Java运行时异常与普通异常的区别
2011-11-09 11:22 1650Throwable是所有Java程序中错误处理的父类,有两种资 ... -
Servlet生命周期与工作原理
2011-11-09 09:13 1111Servlet生命周期分为三个阶段: 1,初始化阶段 ... -
java 单例模式的好处
2011-11-08 17:59 1385java 单例模式的好处 ... -
JAVA工厂模式
2011-11-08 17:29 11001. 简单工厂模式 publci clas ... -
sleep和wait的区别
2011-11-14 16:45 11821、这两个方法来自不同的类分别是,sleep来自Thread类 ... -
String、StringBuffer与StringBuilder之间区别
2011-11-04 21:10 916最近学习到StringBuffer,心中有好些疑问,搜索了一些 ... -
HashMap和Hashtable的区别
2011-10-14 17:53 15171 HashMap不是线程安全的 ... -
遍历HashMap的两种方法及效率
2011-10-14 17:33 4996第一种: Map map = new HashMap(); I ... -
什么是@SuppressWarnings("unchecked")
2010-10-15 10:29 1433@SuppressWarnings 批注允许您 ... -
图片压缩程序实例
2010-08-05 10:08 1337项目中要使用到图片压缩程序,在网上找了一个稍加修改就可以使用了 ... -
java replaceall 用法
2010-06-10 17:09 2235public class TryDotRegEx { publ ... -
修改jar文件中的配置文件
2010-04-13 10:52 3393可以使用两种方法对jar文件进行修改: 1.使用winRAR ... -
重定向请求的两种方式
2009-12-31 14:20 14411.在程序中如何重定向请求呢? 答:重定向请求有两种方式:1 ... -
JVM工作原理
2009-11-30 15:49 11022Java虚拟机Java虚拟机(Ja ... -
java工程最后一个文件夹最后一个文件错误
2009-07-27 13:56 1236今天再次遇到java工程最后一个文件夹最后一个文件出错。 解 ...
相关推荐
什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等...
首先,我们需要理解什么是线程安全。线程安全是指在多线程环境下,当多个线程同时访问同一资源时,该资源仍能保持正确的行为。在日志库中,线程安全通常涉及到对日志文件的并发写入和日志级别的同步控制。 在`Log....
阿里面试题:ConcurrentHashMap为什么是线程安全的? ConcurrentHashMap,其实是线程安全的HashMap,所以阅读ConcurrentHashMap,建议 先阅读一下两篇介绍HashMap的文章 你真的懂大厂面试题:HashMap吗? jdk1.7 ...
首先,我们要理解什么是线程安全。线程安全是指当多个线程同时访问一个对象或方法时,代码仍然能够正确执行,不会出现数据混乱或者异常的情况。在C#中,实现线程安全通常有几种策略:锁(Lock)、Monitor、Mutex、...
首先,我们要了解什么是线程安全。线程安全是指一个类或者方法在多线程环境中被调用时,能够正确地处理并发访问,不会因为线程间的交互而产生错误或不确定的行为。在Java中,线程安全的集合主要分为三类:同步集合、...
首先,我们要理解什么是线程安全和非线程安全。线程安全指的是在多线程环境下,一个函数或方法在同一时刻可以被多个线程调用而不会导致数据的不一致或错误。这通常通过锁机制来实现,如互斥锁(mutex)或者读写锁...
首先,我们需要理解什么是线程安全。线程安全指的是在多线程环境下,一个代码块或方法能够正确地处理多个线程同时访问的情况,不会导致数据不一致或其他未预期的行为。在C#中,确保事件操作线程安全的关键在于同步...
Servlet 线程安全问题 Servlet 线程安全问题是指在使用 Servlet 编程时,如果不注意多线程安全性问题,可能会导致难以发现的错误。Servlet/JSP 技术由于其多线程运行而具有很高的执行效率,但这也意味着需要非常...
首先,我们需要了解什么是线程安全。一个方法或变量被称为线程安全,当它在多线程环境下被调用时,仍然能保证其正确性和完整性。线程不安全则可能引发竞态条件(race condition),即多个线程同时访问和修改同一份...
首先,我们要理解什么是线程安全。线程安全是指当多个线程访问同一代码块时,即使这些线程是并发执行的,程序也能保持其正确性,即不会出现数据混乱或丢失的情况。在Java中,实现线程安全的方法通常包括同步机制...
什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 各线程之间变量不可见,线程通信通过共享主...
mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的 QT的QSqlDatabase是基于mysql的,所以一样是线程不安全的 现讲明mysql为什么是线程不安全的,以及在多线程环境下如何使用mysql,...
首先,我们要理解什么是线程安全。线程安全是指在多线程环境中,一个类或方法可以被多个线程同时访问而不会导致数据不一致或者意外的结果。`HashMap`在设计时并未考虑线程安全,因此在并发场景下,如果不采取适当的...
首先,我们要理解什么是线程安全。线程安全指的是一个对象或函数在多线程环境下,能够正确地处理多个线程同时访问的情况,不会因为线程间的交互导致数据不一致或者异常。为了实现线程安全,我们需要对共享资源进行...
首先,我们需要理解什么是线程安全。线程安全指的是当多个线程同时执行时,一个类或者方法能够正确处理并发调用,保证其内部数据的一致性和完整性。在Java中,如果一个方法或代码块被`synchronized`修饰,那么它将被...
本文将深入探讨在多线程环境中使用List时遇到的非线程安全问题,并提供相应的解决方案和最佳实践。 List是.NET框架中常用的一个动态数组,它提供了方便的增删改查操作。然而,List并未设计为线程安全的容器,这意味...
但是需要注意,虽然这个方法可以保证基本的线程安全,但迭代仍然是非线程安全的,即不能在遍历过程中修改Map。 2. 使用ConcurrentHashMap:Java从1.5版本开始引入了ConcurrentHashMap,它是线程安全且高并发性能的...
在计算机编程领域,尤其是涉及到实时系统和并发编程时,线程锁和线程安全变量是至关重要的概念。LabWindows/CVI是一种流行的交互式C开发环境,特别适合于开发科学和工程应用。本实例将深入探讨如何在LabWindows/CVI...
首先,我们要理解什么是线程安全。线程安全是指在多线程环境下,一个函数或方法被多个线程调用时,不会导致数据不一致或引发异常。在Python中,由于全局解释器锁(GIL)的存在,Python的多线程并不能实现真正的并行...