- 浏览: 593308 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 895Java中有两类集合(Collection),一类是List, ... -
插入排序算法
2011-11-15 16:35 1053插入排序 Insertion Sort ... -
任意10进制的数,然后打印其2进制形式的时候里面包含多少个1
2011-11-15 15:36 1160具体做法有两种: 方法一: public class A{ ... -
交换两个数不使用第三方变量
2011-11-15 14:04 1474题目很简单:------------------------- ... -
Java 冒泡排序
2011-11-15 11:05 1118冒泡的思想精髓就是数组中相临的两个数依次相比较,如果左边的数小 ... -
Java运行时异常与普通异常的区别
2011-11-09 11:22 1616Throwable是所有Java程序中错误处理的父类,有两种资 ... -
Servlet生命周期与工作原理
2011-11-09 09:13 1079Servlet生命周期分为三个阶段: 1,初始化阶段 ... -
java 单例模式的好处
2011-11-08 17:59 1333java 单例模式的好处 ... -
JAVA工厂模式
2011-11-08 17:29 10671. 简单工厂模式 publci clas ... -
sleep和wait的区别
2011-11-14 16:45 11251、这两个方法来自不同的类分别是,sleep来自Thread类 ... -
String、StringBuffer与StringBuilder之间区别
2011-11-04 21:10 889最近学习到StringBuffer,心中有好些疑问,搜索了一些 ... -
HashMap和Hashtable的区别
2011-10-14 17:53 14741 HashMap不是线程安全的 ... -
遍历HashMap的两种方法及效率
2011-10-14 17:33 4943第一种: Map map = new HashMap(); I ... -
什么是@SuppressWarnings("unchecked")
2010-10-15 10:29 1392@SuppressWarnings 批注允许您 ... -
图片压缩程序实例
2010-08-05 10:08 1297项目中要使用到图片压缩程序,在网上找了一个稍加修改就可以使用了 ... -
java replaceall 用法
2010-06-10 17:09 2191public class TryDotRegEx { publ ... -
修改jar文件中的配置文件
2010-04-13 10:52 3354可以使用两种方法对jar文件进行修改: 1.使用winRAR ... -
重定向请求的两种方式
2009-12-31 14:20 13631.在程序中如何重定向请求呢? 答:重定向请求有两种方式:1 ... -
JVM工作原理
2009-11-30 15:49 10980Java虚拟机Java虚拟机(Ja ... -
java工程最后一个文件夹最后一个文件错误
2009-07-27 13:56 1197今天再次遇到java工程最后一个文件夹最后一个文件出错。 解 ...
相关推荐
阿里面试题:ConcurrentHashMap为什么是线程安全的? ConcurrentHashMap,其实是线程安全的HashMap,所以阅读ConcurrentHashMap,建议 先阅读一下两篇介绍HashMap的文章 你真的懂大厂面试题:HashMap吗? jdk1.7 ...
什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等...
什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 各线程之间变量不可见,线程通信通过共享主...
servlet线程安全问题servlet线程安全问题
什么是线程安全问题? 当 多个线程 同时共享同一个 全局变量 做 写 的操作时候,可能会受到其他线程的干扰,导致数据 脏读 。(数据一致性问题) 如何解决线程安全问题? 核心思想:在同一时刻,只能有...
2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS? 7. 什么是原⼦操作?在Java Concurrency API中有哪些原⼦类(atomic classes)? 8. 什么是Executors...
mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的 QT的QSqlDatabase是基于mysql的,所以一样是线程不安全的 现讲明mysql为什么是线程不安全的,以及在多线程环境下如何使用mysql,...
你还在用synchronized?线程安全相关知识深入剖析
HashMap为什么是线程不安全的?如何解决HashMap的线程不安全问题?
1.什么是线程安全性(what) 2.如何分辨一个类是否线程安全?(HOW) 3.为什么hashmap不安全 why 3.1 插入HashMap.put 3.1.1 HashMap 在扩容的时候 3.2 HashMap 在删除数据的时候 0.背景 经常会看到说HashMap是线程...
目录网盘文件永久链接 01课程安排av 02什么是并发和并行av 03什么是进程和线程avi ...10.线程安全问题什么是线程安全avi 11线程安全同题问题分析avi 12线程安全问题线程安全问题演示avi ...............
最近在做多线程方面的工作,工作中发现多线程中很多坑,这里就有一个List添加对象的误区,解释了List容量扩展后内存开辟导致的线程不安全性的问题,这里做个分享跟大家讲讲这个坑是怎么形成的怎么样避免。
c++ stl线程安全 c++ stl线程安全 c++ stl线程安全
申明:不是原创,不是原创,只是转载。 这是一个来自网上的例子 ...用于测试QList的线程安全性,因原作者只给出源代码,没有给出测试结果,这里生成一个QT工程,打开即可编译,内部有ReadME.txt,简要说明
C++线程安全日志库-Win32接口实现,博客讲解:https://www.cnblogs.com/swarmbees/ ->C++线程安全日志库-Win32接口实现
Action是否线程安全 Action是否线程安全 Action是否线程安全
该文件中实例说明了如何在Labwindows/cvi中使用线程锁和线程安全变量进行多线程程序设计
线程安全的单例模式 线程安全的单例模式 线程安全的单例模式
操作系统c++编程实现安全型双向链表,线程的创建,利用线程对链表进行增删改操作,并检验结果是否正确
servlet与Struts action线程安全问题分析