有人可以解释为什么以下代码导致死锁.我的理解是,当alphonse(线程)运行然后它获取对朋友obj的锁定,因为它调用bow()方法但是gaston(另一个线程)如何能够在alphonse尚未完成时获取同一朋友obj上的锁定/释放朋友obj的锁定.
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.println("invoked by " + name);
System.out.format("%s: %s"
+ " has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
System.out.printf("finished by " + name);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"
+ " has bowed back to me!%n",
this.name, bower.getName());
System.out.println("exiting bowBack()");
}
}
public static void …
Run Code Online (Sandbox Code Playgroud) 我正在使用Spring启动1.2.2.Release和Java 8,问题是Spring Optional payload
在传递它时多次包装到新的Optional对象中transformer/service activator
.例如
@ServiceActivator(inputChannel = ..., outputChannel = ...)
public Optional<Foo> transform() {returns -> Optional.of(foo);}
@ServiceActivator(inputChannel = ..., outputChannel = ...)
public Optional<Foo> doSomething1(Optional<Foo> payload) {
payload.ifPresent(f -> {System.out.println(f.getId());}); // this line throws ClassCastException
return foo;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码抛出ClassCastExcpetion(无法将java.util.Optional强制转换为Foo)的原因是因为payload
而不是包含foo
值包含另一个可选对象,而Optional对象包含foo
为value.
我已经在这里提到了这个
现在,Spring Integration始终处理Java 8的Optional类型.
我甚至尝试过使用文档中提到的框架的确切版本但没有成功
解决方法:我尝试创建一些包含有效负载的Wrapper(PayloadWrapper)对象,它可以工作.但可能还有其他一些方法吗?