Effective Java学习笔记(九)


第9章 线程(Threads)
48 同步对共享可变数据的访问(Synchronize access to shared mutable data)
你可能认为应该避免在读取或写入原子数据时使用同步,以此来提高性能。这种想法是很错误的。原子性保证了一个线程在读取原子数据的时候不会看到随机的值,但是不能保证一个线程写入的值能被另一个线程看到。线程之间的可靠通讯也需要同步,而不仅仅是互斥操作的时候需要。
Volatile限定符保证每个读取一个域的线程都会看到最近被写入的值。
Lazy initialization采用的双重检查方法并不起作用。
一种可以采用的方法就是initialize-on-demand holder class。
private static class FooHolder {
 static final Foo foo = new Foo();
}
public static Foo getFoo() {return FooHolder.foo;}
不过这种模式只对静态域有用,对实例域不起作用。

第9章 线程(Threads)
48 同步对共享可变数据的访问(Synchronize access to shared mutable data)
你可能认为应该避免在读取或写入原子数据时使用同步,以此来提高性能。这种想法是很错误的。原子性保证了一个线程在读取原子数据的时候不会看到随机的值,但是不能保证一个线程写入的值能被另一个线程看到。线程之间的可靠通讯也需要同步,而不仅仅是互斥操作的时候需要。
Volatile限定符保证每个读取一个域的线程都会看到最近被写入的值。
Lazy initialization采用的双重检查方法并不起作用。
一种可以采用的方法就是initialize-on-demand holder class。
private static class FooHolder {
 static final Foo foo = new Foo();
}
public static Foo getFoo() {return FooHolder.foo;}
不过这种模式只对静态域有用,对实例域不起作用。
49 避免过多的同步(Avoid excessive synchronization)
为了避免死锁的危险,不要在同步的方法或是块内部把控制权交给客户。换句话说,在同步区域内,不要调用可以被重载的公共的或是保护的方法。如果的确需要调用这些方法,移到同步块的外面。
在同步块里面做的事情越少越好。获取锁,检查共享数据,必要的时候转换数据,然后放弃锁。如果一定要做一些费时的工作,找出一个方法把它们移到同步块外面。
考虑提供同一个类的同步和不同步的两个版本。一种方法是提供一个包装类实现该类所描述的功能,然后在把方法的调用转发到被包装的类之前,执行相应的同步操作。另一种方法是继承该类。
如果一个类或者静态方法依赖可变的静态域,它必须在内部是同步的。
50 不在循环之外调用wait(Never invoke wait outside a loop)
标准的使用wait方法的模式是
synchronized (obj) {
 while ( <condition does not hold>)
  obj.wait();
}
尽量使用notifyAll。使用notifyAll不会损害正确性,但是会损害性能。
51 不要依靠线程的调度工具(Don't depend on the thread scheduler)
任何依靠线程调度工具来保证其正确性的程序都是不可移植的。
要保证这一点,只需要确保任何时候只有很少的线程在运行即可。
Thread.yeild并不能提高性能。但是可以用来在调试的时候人工的提高程序的并发性。
52 记录线程的安全性(Document thread safety)
方法中限定符synchronized的出现是实现细节,是输出的API的一部分。
为了很好的在多线程情况下使用,一个类必须清楚的记录它的线程安全级别。
一共有如下5级:不变的,线程安全的,有条件线程安全的,线程兼容的,线程不友好的。
为了防止DOS攻击,应该使用私有的锁对象。
对于设计用来被继承的类来说,最好使用内部的锁对象。
53 避免使用线程组(Avoid thread groups)
线程组在很大情况下已经过时了。
线程组的一个用处就是一次性设置多个线程的primitives。
另外一个可以使用线程组的情况是:ThreadGroup.uncaughtException方法在当组中的一个线程抛出没有被捕获的异常时,会被自动调用。这个方法可以被运行环境用来对未捕获的异常进行响应。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值