结论:
使用同步锁的同步代码块中调用了外来方法,此外来方法也使用到了相同的同步锁,相互等待造成死锁。
例程代码如下:
ObservableSet<Integer> set = new ObservableSet<Integer>(
new HashSet<Integer>());
//addObserver这一步需要List对象observers锁
set.addObserver(new SetObserver<Integer>() {
public void added(final ObservableSet<Integer> s, Integer e) {
//将打印1,2,3...,23,然后和外部方法相互等待,造成死锁
System.out.println(e);
if (e == 23) {
ExecutorService executor = Executors
.newSingleThreadExecutor();
final SetObserver<Integer> observer = this;
try {
executor.submit(new Runnable() {
public void run() {
//removeObserver是外来方法,需要List对象observers锁
s.removeObserver(observer);
}
}).get();
} catch (ExecutionException ex) {
throw new AssertionError(ex.getCause());
} catch (Interr