非严格意义上讲,一个对象的状态(state)就是它的数据。何为数据,比如实例的或者静态的域。当然对象的state也可以包含其他。
并发条件下的不安全因素始于这些状态。这些状态可能被诸多不同线程修改从而造成不一致的风险。避免风险就要使得这些并发的线程同步协作。java的首选的同步机制是使用synchronized关键字,该关键字提供一种排他性的锁。当然是先同步还包括了volatile变量,显式锁,以及原子变量。
避免风险的三条法则:
-
Don't share the state variable across threads;
-
Make the state variable immutable; or
-
Use synchronization whenever accessing the state variable。
最便捷的方法莫过于使对象“无状态化”。
Stateless objects are always thread-safe.