ich habe das folgende Szenario:Sind Verfahren Referenzen als Methodenparameter Thread-sicher in Java
interface ValueBinding<T> {
public void setValue(T input);
}
public enum FacesBinding {
VALUE;
public void bindString(ValueBinding<String> fcn, HttpServletRequest req, String param){
try {
String val = req.getParameter(param);
if(val != null)
fcn.setValue(val);
} catch (Exception e) { }
}
public void bindBoolean(ValueBinding<Boolean> fcn, HttpServletRequest req, String param){
try {
fcn.setValue(req.getParameter(param) != null);
} catch (Exception e) { }
}
public void bindInt(ValueBinding<Integer> fcn, HttpServletRequest req, String param){
try {
int val = Integer.parseInt(req.getParameter(param));
fcn.setValue(val);
} catch (Exception e) { }
}
public void bindLong(ValueBinding<Long> fcn, HttpServletRequest req, String param){
try {
long val = Long.parseLong(req.getParameter(param));
fcn.setValue(val);
} catch (Exception e) { }
}
...
...
}
und ich verwende es in einem „multithreaded“ Umwelt wie folgt aus:
gleichzeitige Threads sind diese Methode aufrufen
@Override // concurrent Threads are calling this method
public Category initData(FacesContext facesContext) throws Exception {
Category entity = new Category();
HttpServletRequest req = facesContext.getRequest();
FacesBinding.VALUE.bindLong(entity::setId, req, Table.Category.Field.ID.name());
FacesBinding.VALUE.bindString(entity::setName, req, Table.Category.Field.NAME.name());
FacesBinding.VALUE.bindInt(entity::setPosition, req, Table.Category.Field.POSITION.name());
FacesBinding.VALUE.bindBoolean(entity::setLocalized, req, Table.Category.Field.LOCALIZED.name());
return entity;
}
ist
FacesBinding.VALUE.bindLong(entity::setId, req, Table.Category.Field.ID.name());
100% threadsicher wenn i eine Methode Referenz (Schnittstelle) entity::setId
als Parameter einer Methode in enum Object (Singleton) pass?
HINWEIS:
entity::setId
entity::setName
entity::setPosition
... etc. Alle diese Methoden sind Standard-Java-Setter-Methoden
public void setId(long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
....
UPDATE:
sein Beton: SIND
Category entity = new Category();
entity.setId(5);//thread safe for sure
100% gleich
FacesBinding.VALUE.bindLong(entity::setId, ...);
macht die Tatsache, dass FacesBinding
Singleton ist und die Methode Reference in bindLong(entity::setId, ...)
macht es Thread-unsicher?
Ich sehe nicht, was diesen Thread sicher machen könnte. Aber das verdienen einige Forschung – AxelH
@AxelH, ist nicht die Tatsache, dass die Methode bindLong (entity :: setId, ...) eine Methode einer neuen Instanz des Objekts (neue Category() in meinem Fall) macht es thread sicher? –