- 浏览: 7325611 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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的信息
避免过多的使用同步,过多的使用同步可能会导致性能降低,死锁,甚至不确定的行为。
为了避免死锁的危险,在一个被同步的方法或者代码块中,永远不要放弃对客户的控制。
在一个被同步的区域内部,不要调用一个不被改写的公有或者受保护的方法,从包含
该同步区域的类的角度来看,这样的方法是一个外来者。
可以可以为止这个外来方法提供一个实现,并且在该方法中创建另一个线程,在回调到这个类中。
然后,新建的线程试图获取原线程所拥有的那把锁,这样会导致新建的线程被阻塞,如果创建该线程的方法正在等待这个线程完成任务,则死锁就形成了。
不同区域之外被调用的外来方法被称为开放调用,除了可以避免死锁之外,开放调用可以极大地增加并发性,外来方法的运行时间可能会任意长,如
果在同步区域内调用外来方法的话,那么在外来方法执行期间,其他线程要想访问共享对象都被不必要的拒绝。
通常在同步区域内你应该尽可能少的工作。获得锁,检查共享数据,根据需要转换数据,然后放掉锁,如果你必须要执行某一个很少时的动作,则应该
设法把这个方法移动到同步区域的外部。
如果一个类或者静态方法以来于一个可变的静态域,那么他必须要在内部进行同步,即使它往往只用于单个线程,与共享实例不同。这种情况下,对于
客户要执行外部同步是不可能的,因为不可能保证其他的客户也会执行外部同步。
简而言之,为了避免死锁和数据破坏,千万不要从同步区域内部调用外来方法。
永远不要在循环的外面调用wait
Object.wait方法的作用是使用一个线程等待某个条件,他一定是在
一个同步区域中被调用的,而且该同步区域锁住了被调用的对象。
wait的方法的标准模式:
<pre>
synchronized (obj) {
while(<condition does not hold >){
obj.wait();
}
...//perform action appropriate to condition
}
</pre>
总是使用wait循环模式来调用wait方法。永远不要在循环的外面调用wait,循环被用于等待的前后测试条件。
在等待之前测试条件,如果条件已经成立的话则跳过等待,这对于确保灵活性。
如果条件已经成立,并且在线程等待之前notify(或者notifyAll)方法已经被调用过,
则无法保证该线程将总会从等待中醒过来。
创建一个显示工作队列DisplayWorkQueue : 创建一个死锁的工作队列类: 两个线程均需要获取对象锁,造成死锁的解决方法是修改workqueue中的同步方法: 修改之后如下: package com.etrip.effective;
import java.util.LinkedList;
import java.util.List;
/**
* @author longgangbai
* @date 2012-11-22
*
*/
public abstract class WorkQueue {
private final List queue=new LinkedList();
private boolean stopped=false;
protected WorkQueue(){
new WorkerThread().start();
}
public final void enqueue(Object workItem){
synchronized (queue) {
queue.add(workItem);
queue.notify();
}
}
public final void stop(){
synchronized (queue) {
stopped=true;
queue.notify();
}
}
public abstract void processItem(Object workItem)throws InterruptedException;
private class WorkerThread extends Thread{
@Override
public void run(){
while(true){
Object workItem=null;
synchronized (queue) {
while(queue.isEmpty() && !stopped){
try {
queue.wait();
} catch (InterruptedException e) {
return;
}
}
if(stopped){
return ;
}
workItem=queue.remove(0);
try {
processItem(workItem);
} catch (InterruptedException e) {
return;
}
}
}
}
}
}
package com.etrip.effective;
/**
*
* @author longgangbai
*/
public class DisplayWorkQueue extends WorkQueue {
public void processItem(Object workItem)throws InterruptedException
{
System.out.println(workItem);
Thread.sleep(1000);
}
}
package com.etrip.effective;
/**
*
* @author longgangbai
*/
public class DeadLockQueue extends WorkQueue {
public void processItem(final Object workItem)throws InterruptedException
{
Thread child=new Thread(){
public void run(){
enqueue(workItem);
}
};
child.start();
child.join();//dead lock
}
}
abstract class WorkQueueExt{
private final List queue=new LinkedList();
private boolean stopped=false;
protected WorkQueueExt(){
new WorkerThread().start();
}
public final void enqueue(Object workItem){
synchronized (queue) {
queue.add(workItem);
queue.notify();
}
}
public final void stop(){
synchronized (queue) {
stopped=true;
queue.notify();
}
}
public abstract void processItem(Object workItem)throws InterruptedException;
private class WorkerThread extends Thread{
@Override
public void run(){
while(true){
Object workItem=null;
synchronized (queue) {
while(queue.isEmpty() && !stopped){
try {
queue.wait();
} catch (InterruptedException e) {
return;
}
}
if(stopped){
return ;
}
workItem=queue.remove(0);
}
//将代码放在同步之外,解除死锁
try {
processItem(workItem);
} catch (InterruptedException e) {
return;
}
}
}
}
}
如果处于等待状态的所有线程都在等待同一个条件,而每次只有
一个线程可以从这个条件中被唤醒,那么你可以选择调用notify而不是notifyAll.
使用notifyAll优先于notify的建议有一个警告:虽然使用notifyAll不会影
响正确性,但是会影响性能。实际上,从系统角度来看,它会使某些数据结构的性能,从等待线程数的线性退化到平方级别。
发表评论
-
JUnit4.1源代码分析
2013-11-19 17:16 2346用JUnit4进行测试有两种方式分别是: (1)、命令 ... -
TestNG参数化测试之支持数据对象
2013-11-19 12:55 1739Junit4与TestNG对比 ... -
深入JUnit源码之Statement
2013-11-19 10:39 2461转载自: http://www.blogjava.net/ ... -
Junit4参数化测试
2013-11-15 17:25 1876现有这样 ... -
SWTBot中junit4通知RunNotifier的使用
2013-11-15 17:20 1645在junit4中的监听接口为Run ... -
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为了节省时间,就不翻译了,摘抄重点总结 ...
相关推荐
例如,在Java中,我们可以使用`synchronized`关键字来实现线程同步,这样在同一时间只有一个线程可以访问特定的代码块或方法,避免了数据竞争的问题。 异步处理则允许任务并行执行,主线程不会被阻塞,而是通过回调...
17. **消息链(Message Chain)**:避免过多的链式调用,可以考虑引入代理或中介者模式以简化调用。 18. **中间人(Middle Man)**:如果类大部分方法都在做分派,可能需要重新设计,减少不必要的间接层。 19. **...
Java多线程与同步是Java编程中的重要概念,它们在构建高效、响应迅速的应用程序时起着关键作用。本文将深入探讨Java中的多线程机制以及如何通过同步控制来确保线程安全。 首先,让我们理解什么是多线程。在单线程...
`ExecutorService`和`ThreadPoolExecutor`可以帮助我们有效地管理线程,限制并发执行的任务数量,避免过多线程导致的资源浪费。线程池可以预先创建一定数量的线程,待有任务时复用,提高了系统效率。 死锁是多线程...
或者在脚本中使用`set`命令直接设置: ``` set JAVA_OPTS='-Xms64m -Xmx512m' ``` ##### 代码优化 除了调整JVM配置外,优化代码逻辑也是关键。具体措施包括: - **避免不必要的对象创建**:检查代码中是否...
最后,我们需要关注Java并发的性能优化技巧,如避免过多的线程上下文切换,使用并发集合类(如ConcurrentHashMap、CopyOnWriteArrayList等)来减少同步开销,以及使用Lock接口提供的更细粒度的锁控制来提高并发性能...
在实际编程中,通常不推荐过多地依赖线程优先级来实现并发控制,而是应该更多地使用同步机制(如`synchronized`关键字、`Lock`接口等)、线程池(`ExecutorService`)和并发工具类(如`Semaphore`, `CountDownLatch`...
通过这种方式,我们可以控制并发数量,避免过多线程导致的资源消耗。 为了保证转账的正确性,我们需要在转账操作中加入同步控制。例如,使用`synchronized`关键字修饰转账方法,确保同一时刻只有一个线程能访问该...
12. 不要在循环中使用:Try { } catch() { } 应把其放置在最外层。 Java 中的异常处理需要放在最外层,以避免循环中的异常处理问题。 13. StringBuffer 的使用:StringBuffer 表示了可变的、可写的字符串。 Java ...
- 性能开销:由于同步会带来上下文切换和锁竞争,所以过多使用`synchronized`可能导致性能下降。 - 无法中断:等待获取锁的线程无法被中断,除非调用`interrupt()`方法或者抛出异常。 - 不可中断的阻塞:`...
使用线程池可以有效地控制运行的线程数量,避免过多线程导致系统资源过度消耗,同时也能简化线程的管理和回收。Java的ExecutorService和ThreadPoolExecutor是线程池的核心组件。 1. **线程创建和销毁成本** 创建和...
- **使用静态方法减少对象创建**:在`OpenidServices`类中使用静态方法`getOpenidAccount`可以减少不必要的对象实例化,因为静态方法不需要创建类的实例。 - **合理设计对象的生命周期**:对于临时需要的大型对象,...
避免过多的内联注释,保持代码的自我解释性。 9. **异常处理**:异常处理应具有针对性,避免使用catch(Exception e),这会隐藏错误信息。自定义异常应继承自已有的异常类,如继承自RuntimeException或Exception。...
18. **避免过多的反射操作**:反射虽强大,但性能较低,应尽量减少使用。 19. **使用适当的数据结构**:根据需求选择合适的数据结构,如用 HashSet 替换 List 做去重。 20. **使用局部变量存储迭代器**:在遍历...
1. **避免过度使用同步**:在多线程环境中,过多的同步可能导致线程阻塞,降低系统性能。可以考虑使用并发容器(如ConcurrentHashMap)或锁分离技术来减少锁竞争。 2. **理解并合理使用集合框架**:例如,ArrayList...
- 单行注释使用`//`,多行注释使用`/* */`,避免在代码中使用`/*`开头的多行注释。 - 注释应简洁明了,描述代码的目的和行为,而非代码本身。 3. **代码格式** - 每个缩进使用4个空格,不使用制表符。 - 大括号...
7. **避免在循环中使用同步方法或锁**:这会导致线程阻塞,影响性能。可以考虑使用并发容器,如ConcurrentHashMap。 8. **有效使用并发工具**:使用ExecutorService、Future、Callable等并发API,避免创建大量线程...
5. **避免过多的对象创建**:频繁的对象创建和销毁会产生垃圾收集压力,可能导致性能下降。通过重用对象或使用对象池可以减轻这种影响。 6. **优化方法调用**:尽量减少不必要的方法调用,尤其是对于昂贵的操作。在...
在并发编程方面,规范强调正确使用同步机制,避免出现死锁、活锁和饥饿现象。合理使用volatile关键字,确保多线程环境中的数据可见性。线程安全的类应谨慎使用,尽量通过线程池管理线程,以提高系统资源的利用率。 ...