群集rife的第一个障碍是线程安全地访问这个HashMap。
正确设计的完全线程安全类不需要调用任何同步函数。
要用线程安全地编写程序是很难的;需要*纵线程的程序很容易引起不一致的数据、死锁、不可伸缩的锁定以及倒置的优先级等问题。
同时,这样仍不足以提供真正的线程安全*,许多公用的混合*作仍然需要额外的同步。
将其转换为线程安全是一件简单(其实很困难,编写充满bug的代码倒是很简单)的工作(但是需要更多的努力)。
管理非线程安全类的使用比试图使类成为线程安全的要更容易些。
(不可变类的一个优点就是它们是线程安全的)。
创建完全线程安全类的有效技术是将同步类合并到资源类中。
它最简单的使用模式便是作为一个线程安全的队列,并且在队列为空时阻塞消费者。
要支持从不同线程登记侦听器,那么不管用什么机制存储和管理活动侦听器列表,这个机制都必须是线程安全的。
编写线程安全类是困难的。
它常常是把有状态类描绘成线程安全的,或者封装非线程安全类以使它们能够在多线程环境中安全地使用的最容易的方式。
您可能偶尔会思考是否要同步化这个方法调用,还是只同步化该方法的线程安全子集。
不使用双重检查锁定,而使用Initialize- on - demandHolderClassidiom,它提供了迟缓初始化,是线程安全的,而且比双重检查锁定更快且没那么混乱。
在新的内存模型中,对双重检查锁定的这个“修复”使 idiom线程安全。
因为根据设计它是线程安全的,创建它之后可以把它缓存在一个公共静态最终变量中,或者包装在单实例模式中以供以后访问。
很容易“忘记”这个规则,特别是在读取时——但是这么做可以造成很多有关程序线程安全的风险。
该定时器类的实例能够被多个线程安全地访问。
您还应该记得,在方法调用之间保留状态的静态类在默认情况下应该是线程安全的。
用这种方式设计线程安全类使得在多线程应用程序中使用该类与使用非线程安全类一样容易,但却具有更高的安全级别。