我的比赛条件有点问题。
public class MyClass1 {
static ThreadLocal<MyInterface> threads = new ThreadLocal();
static MyInterface getThread(){
return threads.get();
}
static String saveId(String name){
return getThread.saveId());
}
}
public interface MyInterface {
String saveId(String name);
}
public class MyClass2 implements MyInterface {
MyDao dao;
public String saveId(String name){
Session s= dao.getcurrentSession();
String id = (String)s.save(new myobject(name));
return id;
}
}
还有我的问题,当我尝试使用单例和休眠模式将对象保存到数据库时,如何排除竞争条件是更好的选择?
我认为,正确的解决方案是
private volatile String id;
public synchronized String saveId(String name){
Session s= dao.getcurrentSession();
id = (String)s.save(new myobject(name));
return id;
}
我错了吗?
P.S。 关于代码的第二个猜测:
public String saveId(String name){
Session s= dao.getcurrentSession();
String id = s.createQuery("select id from myobject where name= :name order by id desc").setParameter("name",name).uniqueResult();
if (!StringUtils.isEmpty(id)) {
id = makeId(name);
}
return id;
}
public String makeId(String name) {
String id = s.createQuery("select id from myobject where name= :name order by id desc").setParameter("name",name).uniqueResult();
if (!StringUtils.isEmpty(id)) {
synchronized (MyClass2.class){
id = (String)s.save(new myobject(name));
s.flush();
}
}
return id;
}