易截截图软件、单文件、免安装、纯绿色、仅160KB

[译文]一些Java并发技巧

原文:Some Java Concurrency Tips
作者:Carol McDonald
出处:
http://weblogs.java.net/blog/caroljmcdonald/archive/2009/09/17/some-java-concurrency-tips
 
这是来自Joshua Bloch、Brian Goetz和其他人的一个关于一些并发技巧的汇总。
 
首先选择不可变的对象/数据
 
不可变对象(immutable object)在构建之后就不会改变了,不可变对象更简单、安全,不需要锁,并且是线程安全的。为了使得不可变对象无需提供setter/mutator方法,把域修饰成private final的,并可防止其子类别化。如果不可选择不变性,那么限制可变的状态,越少的可变状态意味着越少的协调配合。在任何实际可行的情况下把域声明成final的,final域比可变域要简单得多。
在线程共享可变数据的时候,每个读线程或者写线程都必须要协调对数据的访问,未能同步共享的可变数据可能会导致原子性的失败、竞争条件、不一致的状态,以及其他形式的非确定性。这些不确定的问题都是最难以调试的。
使并发交互只在明确定义的地方发生,减少共享数据,考虑复制而不是共享。
 
Web应用的线程风险
 
一个Servlet的get、post、service方法能够同时被多个客户端调用,多线程Servlet实例和静态变量是共享的,因此如果是可变的话,那么访问必须加以协调。Servlet是典型的生命期长且被线程高频度加载的对象,如果过分同步的话性能会受影响,或者尽量共享不可变(final)数据,或者尝试完全不共享,请求参数和局部变量会更安全。
 
保持锁定的时间尽可能的短
 
在同步区内完成尽可能少的工作,把不需要加锁的代码放到同步代码块之外,特别是如果这些代码非常耗时的话!
 
 
 
 
Lock接口比使用同步代码块提供了更详尽的锁定操作,其有一个好处是如果锁是不可用的话,则不会导致阻塞。你应该只有在需要的时候才获取锁来读取或者写入共享的数据,并在一个finally子句内部解锁,以确保锁被释放。下面是一个使用ReentrantReadWriteLock的例子:
 
 
 
 
 
 
一种减少保持锁定的时间的做法是锁分拆或者锁分离,该方法是为各个状态变量使用不同的锁而不是使用单个锁,这减小了锁的粒度,提供了更好的可伸缩性,但必须要按照规则顺序来取用锁,否则会有死锁的危险。
 
首先选择executor和task而不是thread
 
使用Java并发工具Executor框架(Java Concurrency Utiliti


相关文档:

J2EE、Java SE、Java EE、Java ME 区别

 Java SE=Java Standard Edition
Java EE=Java Enterprise Edition
Java ME=Java Mobile Edition
SE主要用于桌面程序,控制台开发(JFC)
EE企业级开发(JSP,EJB)
ME嵌入式开发(手机,小家电) 
         目前,Java 2平台有3个版本,它们是适用于小型设备和智能卡的Ja ......

Thinking In Java Notes

1. 对于一个static方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。
2. 当使用泛型类时,必须在创建对象的时候制定类型参数的值,而是用泛型方法的时候,通常不必指定参数类型,因为编译器会为我们找出具体的类型。这称为类型参数推断。 ......

Java的深拷贝和浅拷贝(2)

上一篇文章讲述了浅拷贝和深拷贝的含义,并且给出了浅拷贝的一个例子
这篇文章在那个例子的实现上作出修改,实现深拷贝,代码如下:
package com.test;
public class CloneTest
{
public static void main(String[] args)
{
Student s1 = new Student();
s1.setAge(20);
s1.setName("wudi");
School sch ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号