1.
Whenever more than one thread accesses a given state variable, and one of them might write to it, they all must coordinate their access to it using synchronization. The primary mechanism for synchronization in Java is the synchronized keyword, which provides exclusive locking, but the term "synchronization" also includes the use ofvolatile variables, explicit locks, and atomic variables.
You should avoid the temptation to think that there are "special" situations in which this rule does not apply. A program that omits needed synchronization might appear to work, passing its tests and performing well for years, but it is still broken and may fail at any moment.
If multiple threads access the same mutable state variable without appropriate synchronization,your program is broken. There are three ways to fix it:
|
2.
A class is thread-safe if it behaves correctly when accessed from multiple threads, regardless of the scheduling or interleaving of the execution of those threads by the runtime environment, and with no additional synchronization or other coordination on the part of the calling code. |
3.
Stateless objects are always thread-safe. |
4.
To preserve state consistency, update related state variables in a single atomic operation. |
5.
6.
Do not allow the this reference to escape during construction. |
7.
Implicitly Allowing thethis Reference to Escape.Don't Do this.
public class ThisEscape { public ThisEscape(EventSource source) { source.registerListener( new EventListener() { public void onEvent(Event e) { doSomething(e); } }); } } 1. A final mechanism by which an object or its internal state can be published is to publish an inner class instance, as shown in ThisEscape in Listing 3.7. When ThisEscape publishes the EventListener, it implicitly publishes the enclosing ThisEscape instance as well, because inner class instances contain a hidden reference to the enclosing instance.2. ThisEscape illustrates an important special case of escapewhen the this references escapes during construction. When the innerEventListener instance is published, so is the enclosingThisEscape instance. But an object is in a predictable, consistent state only after its constructor returns, so publishing an object from within its constructor can publish an incompletely constructed object. This is trueeven if the publication is the last statement in the constructor. If thethis reference escapes during construction, the object is considerednot properly constructed. |
8.
If a class is composed of multiple independent thread-safe state variables and has no operations that have any invalid state transitions, then it can delegate thread safety to the underlying state variables.
第一部分总结
|