.
, :
public final class A {
private final Object o;
private A(final Object o) { if (o == null) throw new Error(); this.o = o; }
public static A a() { return new A(new Object()); }
public Object getO() { return o; }
}
, , , , null.
-, ( ) final, , ( - , , - SecurityManager, ).
, private ( , , ). , setAccessible(true) , .
, , , , (de) .
- . , . .
, " Java",
API "sun.misc.Unsafe", Sun, . , .
, , , .. getDeclaredField ( "o" ). , , .
.
, , :
class StockQuoteProvider {
private QuoteCache cache;
private Thread quoteCacheUpdater;
public StockQuoteProvider() {
this.quoteCacheUpdater = ...
this.quoteCacheUpdater.start();
}
public Quote getQuote(final String symbol) { return ... }
}
Thread? ? , -, , ? ?! . .
,
. ( edit: , ). , :
class Range {
private final Object lock = new Object();
private int a;
private int b;
Range(final int a, final int b) { setAB(a, b); }
final int[] getAB() { synchronized(lock) { return new int[]{a, b}; } }
final void setAB(final int a, final int b) {
if (!(a < b)) { throw new IllegalArgumentException("Invalid range"); }
synchronized(lock) { this.a = a; this.b = b; }
}
@Override public String toString() {
int[] ab = getAB();
int a = ab[0];
int b = ab[1];
return a + " < " + b;
}
}
, , ? , int [] , , , a b .
, . "" , "a >= b".
, , . , OP 2 : "Object serialize (Object o)" "Object deserialize (Object o)", . , :
public class Test {
public static Range r = null;
public static void Main(final String[] args) {
final Thread t1 = new Thread(new Runnable() {
@Override void run() { r = deserialize(serialize(new Range(1, 3)); }
});
final Thread t2 = new Thread(new Runnable() {
@Override void run() { System.out.println(r); }
});
t1.start();
t2.start();
}
? , null, r T2. ( , ), , T2 r. , JVM Range . , "0 < 0" , T2 a b, "1 < 0" ( a), "0 < 3" "1 < 3" . Java, ( , 5 ).
, , . , ( - , (?) -), ... , ?
...
. ( setAccessible(true)), ( sun.misc.Unsafe) (class Range), , (class StockQuoteProvider). 4 , , Java - .
, , , . , .
.