- 浏览: 7325629 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
并发处理的广泛应用是使得Amdahl定律替代摩尔定律成为计算机性能发展源动力,是人类压榨计算机运算能力最有力的武器
线程安全:
java里面安全程度由强到弱排序(也是由Brian Goetz提出的):不可变,绝对线程安全,相对线程安全,线程兼容,线程对立
不可变:
我觉得原因是它里面状态对象时unsafe对象,所做的操作都是CAS操作,可以保证原子性。
绝对线程安全:
java里面很多看上去非常安全的类,比如vector其实也不能满足这一点。例子:
线程A
for(int i=0; i<vectoe.size();i++) {
vector.remove(i);
}
线程B
for(int i=0; i<vectoe.size();i++) {
vector.get(i);
}
会报ArrayIndexOutOfBoundsException。
需要额外的同步
线程A
synchronized{
for(int i=0; i<vectoe.size();i++) {
vector.remove(i);
}
}
线程B
synchronized{
for(int i=0; i<vectoe.size();i++) {
vector.get(i);
}
}
相对线程安全:
线程兼容:
线程安全的实现
1、互斥同步
在多线程访问的时候,保证同一时间只有一条线程使用。
临界区(Critical Section),互斥量(Mutex),信号量(Semaphore)都是同步的一种手段
java里最基本的互斥同步手段是synchronized,编译之后会形成monitorenter和monitorexit这两个字节码指令,这两个字节码都需要一个reference类型的参数来指明要锁定和解锁的对象(可以通过工具读class文件,这是以后必须要做的),还有个锁的计数器,来记录拥有锁的次数,跟AQS里面的state一样
其实在“Java与线程”里已经提到,java的线程是映射到操作系统的原生线程之上的,不管阻塞还是唤醒都需要操作系统的帮忙完成,都需要从用户态转换到核心态,这是很耗费时间的,是java语言中的一个重量级(Heavyweight)操作,虽然虚拟机本身会做一点优化的操作,比如通知操作系统阻塞之前会加一段自旋等待的过程,避免频繁切换到核心态。
ReentrantLock也是一个很好的选择。
1)ReentrantLock比synchronized增加了一些高级的功能
2)从性能角度考虑,在JDk1.5时代,多线程环境下synchronized的吞吐量下降得非常严重,而ReentrantLock则能保持在比较稳定的水平线上,但是从1.6开始两者性能上基本持平。所以现在这个理由已经不再是了。
虚拟机未来一定是向原生的synchronized改进,所以提倡在synchronized能实现需求的情况下,优先考虑synchronized
2、非阻塞同步
互斥和同步最主要的问题就是阻塞和唤醒所带来的性能问题,所以这通常叫阻塞同步(悲观的并发策略)
随着硬件指令集的发展,我们有另外的选择:基于冲突检测的乐观并发策略,通俗讲就是先操作,如果没有其他线程争用共享的数据,操作就成功,如果有,则进行其他的补偿(最常见就是不断的重试),这种乐观的并发策略许多实现都不需要把线程挂起。
这类的指令有:
1)测试并设置(test-and-set)
2)获取并增加
3)交换
4)比较并交换(CAS)
5)加载链接/条件储存(Load-Linked/Store-Conditional LL/SC)
后面两条是现代处理器新增的处理器指令,在JDK1.5之后,java中才可以使用CAS操作,就是传说中的sun.misc.Unsafe类里面的compareAndSwapInt()和compareAndSwapLong()等几个方法的包装提供,虚拟机对这些方法做了特殊的处理,及时编译出来的结果就是一条平台相关的处理器CAS指令,没有方法调用的过程,可以认为是无条件的内联进去。
原来需要对i++进行同步,但现在有了这种CAS操作来保证原子性,比如用AtomicInteger。 但是不要忘记了CAS存在一个ABA的问题。可以通过AtomicStampedReference来解决
3、无同步方案
要保证线程安全,并不一定就要进行同步,没因果关系。
高效并发是JDK1.6的重要主题(所以我们都会觉得直接跳过1.5用1.6),HotSpot虚拟机开发团队花大量精力实现锁的优化技术 如:适应性自旋、锁消除、锁粗化、轻量级锁、偏向锁等
什么是自适应自旋:
锁消除:
锁粗化:
轻量级锁:
偏向锁:
1、synchronized关键字的作用域有二种:
1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;
3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;
发表评论
-
Mule ESB 学习笔记(20)Mule和Spring httpinvoker的整合
2013-08-28 13:59 3741mule的配置文件: <?xml version=& ... -
Mule ESB 学习笔记(19)Mule和RSS的整合
2013-08-28 10:08 2576定时扫描特定目录的rss文件: <?xml vers ... -
Mule ESB 学习笔记(18)Mule和ATOM的整合
2013-08-27 20:00 2590定时读取特定文件的rss文件: <?xml ... -
Mule ESB 学习笔记(17)Mule和JMX的整合
2013-08-27 16:48 4040Agent的实现: package com.easyway ... -
Mule ESB 学习笔记(16)CXF SOAP基于SAML的验证的配置
2013-08-27 15:19 3780mule的配置 <mule xmlns:core=& ... -
Mule ESB 学习笔记(15)CXF SOAP基于JKS的验证的配置
2013-08-27 14:57 3853mule的配置如下: <mule xmlns:cor ... -
Mule ESB 学习笔记(14)CXF SOAP基于UsernameToken的验证
2013-08-27 14:16 7934简单需求: 针对在webservice ... -
Mule ESB 学习笔记(13)CSV数据文件到数据库
2013-08-26 17:54 7021简单需求: ... -
Mule ESB 学习笔记(12)JSON转换器的使用
2013-08-26 13:54 9065在许多情况下,可能需要把类转换为js ... -
Mule ESB 学习笔记(11)Web Service Proxy
2013-08-24 19:32 6606一、WebSevice Proxy 简介 ... -
Mule ESB 学习笔记(10)mule事务配置
2013-08-23 16:36 6214在mule的事务可能为jdbc事务,jms事务 ... -
Mule ESB 学习笔记(9)mule配置常用节点解释
2013-08-23 13:27 34121 Mule-config.x ... -
Mule ESB 学习笔记(8)mule和jersey的整合使用
2013-08-23 11:20 3925在项目常用jesery作为rest ... -
Mule ESB 学习笔记(7)服务调用
2013-08-23 10:44 18886一. 服务调用 1. Mule实现并提供Web Servi ... -
Mule ESB 学习笔记(6)配置模式
2013-08-23 10:42 4752为了节省时间,就不翻译了,摘抄重点总结 ... -
Mule ESB 学习笔记(5)异步请求-响应方式
2013-08-22 15:32 35665.4 异步请求-响应方式 异步请求-响应方式即请求方调用 ... -
Mule ESB 学习笔记(4)同步方式
2013-08-22 15:19 42235.3 同步方式 同步方式即请求方调用 ... -
JBOSS EJB3项目启动执行一个任务
2013-08-06 22:26 3811在jboss的项目中,jboss启动 ... -
Jboss @Service的使用
2013-08-06 21:59 1971Jboss有一个扩展的annotation——@Servic ... -
julian Date 计算 和实现
2013-08-01 09:32 4422Qt库里CBSDate类的内部实现用_jd成员进行计算、比较 ...
相关推荐
在计算机编程领域,尤其是涉及到实时系统和并发编程时,线程锁和线程安全变量是至关重要的概念。LabWindows/CVI是一种流行的交互式C开发环境,特别适合于开发科学和工程应用。本实例将深入探讨如何在LabWindows/CVI...
线程安全与锁优化:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者再调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果。
绝对线程安全Vector的get()、remove()和size(),如果另一个线程恰好在错误的时间里删除了一个元素,导致序号i已经不再可用的话,再用i访问数组
4. **线程安全与同步机制**: - 确保线程安全,即在多线程环境下,程序的行为不受时序或交替操作的影响。 - `synchronized`关键字用于实现锁,保证同一时刻只有一个线程能执行特定代码块。 - 使用`volatile`修饰...
为了确保线程安全,我们需要在记录日志时进行同步控制,例如使用互斥锁(mutex)。 3. **日志输出函数**:这是核心功能,它接收日志消息并将其写入日志文件。在多线程环境中,我们需要确保每次只有一个线程可以执行...
### JAVA线程安全及性能优化的关键知识点 ...通过以上讨论,我们可以看出Java线程安全与性能优化是一个复杂而重要的主题,需要开发者深入理解Java内存模型,并灵活运用各种工具和技术来确保程序既正确又高效地运行。
虽然提供了基本的线程安全性,但它们不是高度优化的并发解决方案,因为所有操作都需要全局锁定,可能导致性能瓶颈。 2. 并发集合(Concurrent Collections): Java的`java.util.concurrent`包提供了更为高效且...
"C# 高效线程安全,解决多线程写txt日志类.zip" 提供了一个专门用于多线程环境下写入txt日志文件的解决方案,确保了在并发写入时的数据一致性与程序稳定性。 首先,我们要理解什么是线程安全。线程安全是指当多个...
3. **死锁与竞态条件**:在进行线程安全测试时,还需要考虑潜在的死锁和竞态条件。死锁是两个或更多线程相互等待对方释放资源而无法继续执行的情况。竞态条件则发生在多个线程同时修改共享变量时,可能导致结果的不...
在C#编程中,线程安全是多线程应用程序中至关重要的一个方面,尤其是在处理共享资源如文本日志文件时。本主题将深入探讨如何在C#中创建一个高效的线程安全日志类,用于在多线程环境中安全地写入txt日志。 首先,...
`golang-set`库提供了一种实现,包括线程安全和非线程安全的高性能集,非常适合在Go的并发环境中使用。 首先,我们要理解什么是线程安全和非线程安全。线程安全指的是在多线程环境下,一个函数或方法在同一时刻可以...
条件变量常与互斥锁结合使用,以确保线程在等待或被唤醒时的资源安全。 3. **读写锁通信机制**: 读写锁是一种更为精细的同步机制,特别适用于读多写少的情况。读写锁分为读锁和写锁,读锁可被多个线程同时持有,...
Java提供了一些线程通信的工具,如wait(), notify()和notifyAll(),它们都与对象的监视器(monitor)相关联。但在实际使用中,由于它们容易导致死锁和不易管理,现在更推荐使用java.util.concurrent包中的高级并发...
在C++编程中,线程安全容器是一种在多线程环境下能够确保数据一致性与正确性的数据结构。在并发编程中,线程安全是至关重要的,因为它可以防止竞态条件、死锁和其他同步问题,从而避免程序出现未定义的行为。本项目...
总结来说,Java中的`synchronized`关键字是实现线程同步的关键,它通过互斥锁确保对共享资源的访问是线程安全的。在多线程编程中,合理使用`synchronized`可以有效避免竞态条件,保证程序的正确性和稳定性。对于...
为了确保线程安全,我们需要使用锁或其他同步机制来控制对`DataSet`的并发访问。 2. **数据一致性**:`DataSet`的更新操作,如`AcceptChanges()`或`RejectChanges()`,应当在没有其他线程访问时进行,以保持数据的...
这些线程安全集合的实现方式主要是通过使用锁和无锁算法,例如 CAS(Compare-and-Swap)操作,来保证在多线程环境下的数据一致性。它们通常比使用传统的同步机制(如 `lock` 关键字)更高效,因为它们减少了锁的粒度...
Java中的线程安全与线程同步是多线程编程中至关重要的概念,它们涉及到如何在并发环境下保证程序的正确性和一致性。线程安全是指在多线程环境下,一个类或者方法能够正确处理并发访问,不会因为线程间的交互而导致...
然而,多线程环境下的数据共享和操作可能会引发线程安全问题,如果不正确处理,可能导致数据不一致、程序崩溃等严重后果。本示例将探讨如何在Java中实现一个线程安全的订票系统。 首先,我们要理解什么是线程安全。...