>>相反,如果为了避免这个情况,目前通过锁或其他控制总是会损失性能,再加上如果这个Forum获取出来只是读共享,可以忽略不计。呵呵,多谢老师解答。我的项目中因为要对获取的对象进行写操作,所以必须保证获得对象是唯一的。
我的办法是新建一个监视器对象MonitorObject:如下:
public class MonitorObject {
private Class<?> modelClass;
private Serializable key;
public Class<?> getModelClass() {
// TODO Auto-generated method stub
return modelClass;
}
public boolean needSynchroize(Class<PersonalPage> modelClass, String id) {
return this.modelClass.equals(modelClass) && this.key.equals(id);
}
public MonitorObject(Class<?> modelClass, Serializable key) {
super();
this.modelClass = modelClass;
this.key = key;
}
}
有一个ModelManager负责管理Model,ModelManager首先从缓存中获取对象,如果没有不是返回null,而是返回MonitorObject,这个MnitorObject负责检测并发线程想要获得的对象是否是同一个Model,而我判断是否是同一个Model就是简单的判断对应的class和model主键是否一致,如果一致就同步。
客户端代码:
Object model = modelManager.getModel(PersonalPage.class, owner.getId());
if (model instanceof PersonalPage) {
return (PersonalPage) model;
}
//如果缓存中没有对应的对象,那么就从数据库构建,然后放回缓存
PersonalPage page = null;
if (model instanceof MonitorObject) {
MonitorObject monitor = (MonitorObject) model;
if (monitor.needSynchroize(PersonalPage.class, owner.getId())) {
synchronized (PersonalPage.class) {
Object o = modelManager.getModel(PersonalPage.class, owner
.getId());
//fireGetEvent(event);
//Object o = event.getModel();
if (o instanceof PersonalPage) {
return (PersonalPage) o;
}
construct(page, owner);
modelManager.addModle(page.getId(), page);
}
}
}
return page;