《Effective Java读书笔记》--线程

对共享可变数据的同步访问

以下代码经过同步方法实现了延迟初始化。
class Foo {
	private static Foo foo = null;

	public static synchronized Foo getFoo() {
		if (null == foo) {
			return new Foo();
		}
		return foo;
	}

	private Foo() {

	}
}

同步是有额外的开销的,若是不能承受同步而带来的开销,又想实现延迟初始化,还可经过以下的初始化容器类实现: java

class Foo {
	private Foo() {

	}

	private static class FooHolder {
		static final Foo foo = new Foo();
	}

	public static Foo getFoo() {
		return FooHolder.foo;
	}
}

当getFoo方法第一次被调用的时候,它读入FooHolder.foo,才使得FooHolder类被初始化。 程序员

避免过多同步

  • 为了不死锁和数据破坏,千万不要从同步区域调用外来方法。

        好比,同步区内,对象A被加了锁,而且调用了方法func。func是外来方法,能够被用户自定义。考虑一下,若是func方法中,也有一个对象A的同步区,那会怎样?结果会形成死锁!!!! 并发

  • 为了性能考虑,尽可能限制同步区域内的工做量。

不要依赖线程的调度器

  • 不要依赖Thread.yield或者线程优先级
  • 对大多数程序员来讲,Thread.yield的惟一用途是在测试期间人为地增长一个程序的并发性。

避免使用线程组

线程组并无提供太多有用的功能,它已经基本上过期了。 性能

相关文章
相关标签/搜索