我的问题是对此问题的扩展:易失性保证和无序执行
为了使它更具体,让我们假设我们有一个简单的类,它在初始化后可以处于两种状态:
class A {
private /*volatile?*/ boolean state;
private volatile boolean initialized = false;
boolean getState(){
if (!initialized){
throw new IllegalStateException();
}
return state;
}
void setState(boolean newState){
state = newState;
initialized = true;
}
}
Run Code Online (Sandbox Code Playgroud)
初始化的字段被声明为volatile,因此它在"屏障"之前引入,确保无法进行重新排序.由于国家唯一字段写入之前 初始化字段写入和只读后的初始化场被读取,我可以去除挥发性从申报关键字状态,仍然不会看到一个陈旧的价值.问题是:
假设,CountDownLatch用作初始化器而不是标志,如下所示:
class A {
private /*volatile?*/ boolean state;
private final CountDownLatch initialized = new CountDownLatch(1);
boolean getState() throws InterruptedException …Run Code Online (Sandbox Code Playgroud)我正在使用Vaadin 7.1.2并严重依赖其推送通知支持.应用程序启动后,一切都运行良好,但是大约30-40分钟之后突然停止从服务器推送更新,而是登录com.vaadin.ui.UIDetachedException每个更新事件.重启很有帮助但很长时间.
所有配置参数都是默认值,除了我必须添加-Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true命令选项以进行推送工作.
我部署到Tomcat 7.0.36,并且其配置中的所有内容都设置为默认值.
要更新UI,我只需致电
ui.access(new Runnable{...});
Run Code Online (Sandbox Code Playgroud)
在我传递给UI.init()方法中的每个组件的UI实例上.
我错过了什么吗?