【发布时间】:2018-06-10 08:39:03
【问题描述】:
假设我有这段代码
<p:dataTable styleClass="scheduleTable" value="#{todaySchedule.hours}" var="hour">
<p:column headerText="Hour" styleClass="hourColumn" >
#{hour.time}
</p:column>
</p:dataTable>
在一个名为 todaySchedule 的类中,有一个方法
public List<Hour> getHours() {
final List<Hour> hours = IntStream.range(0, Hour.TIME.values().length)
.mapToObj($ -> new Hour()).collect(Collectors.toList());
for (int i = 0; i < 5; i++) {
hours.get(i).setHour(1);
}
return hours;
}
这是 Hour 类
public class Hour {
private int time;
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}
现在,我不确定 JSF 在幕后做了什么来使这个动态 dataTable 数据迭代通过小时列表成为可能,但我假设如果这一切都发生在一个线程中,那么没关系。但是,如果在幕后,getHours 用在另一个线程中,该线程实际上执行生成列并看到 Hour 处于错误状态怎么办?如果 getHours() 方法是
,则可以避免这种情况public List<Hour> getHours() {
final List<Hour> hours = new ArrayList<>();
for (int i = 0; i < 5; i++) {
hours.add(new Hour(i + ""));
}
return hours;
}
with the corresponding Hour class being
public class Hour {
private final int time;
public Hour(int time) {
this.time = time;
}
public int getTime() {
return time;
}
}
但是,我的问题是,如果不更改为后一种设计,在发布此 Hour 实例时,由于 Java 中的可见性问题,使用基本动态 JSF 数据表呈现时会出现问题吗?
【问题讨论】:
-
都在一个线程中
标签: multithreading jsf visibility jsf-2.2 safe-publication