Нет, второй метод не остановится, если названо сначала. Никакие нечетные результаты не произойдут (кроме небольших издержек для проверки блокировки. Этот вопрос привычки очень. Java 6 вперед, у Вас есть огрубление блокировки в JVM - http://java.sun.com/performance/reference/whitepapers/6_performance.html )
, Например, смотрите на исходный код java.util. Вектор. Существует партия вызовов к другим синхронизированным методам из синхронизированных методов.
After some experimentation, there appears to be no way to configure JAXB to handle primitive chars properly. I'm having a hard time accepting it, though.
I've tried defining an XmlAdaptor
to try and coerce it into a String, but the runtime seems to only accept adapters annotated on Object types, not primitives.
The only workaround I can think of is to mark the char field with @XmlTransient
, and then write getters and setters which get and set the value as a String:
@XmlTransient
char gender = 'M';
@XmlElement(name="gender")
public void setGenderAsString(String gender) {
this.gender = gender.charAt(0);
}
public String getGenderAsString() {
return String.valueOf(gender);
}
Not very nice, I'll grant you, but short of actually changing your char field tobe a String, that's all I have.
Это все еще кажется проблемой в Metro JAXB (RI), по крайней мере, в версии Metro, поставляемой с JDK 1.6.0_20.
EclipseLink JAXB (MOXy) правильно маршалирует char:
Чтобы использовать EclipseLink JAXB, просто добавьте eclipselink.jar в путь к классам и добавьте jaxb. properties с классами вашей модели со следующей записью:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
создайте специализированный XmlAdapter:
package br.com.maritima.util;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class CharAdapter extends XmlAdapter<String,Character>{
@Override
public String marshal(Character v) throws Exception {
return new String(new char[]{v});
}
@Override
public Character unmarshal(String v) throws Exception {
if(v.length()>0)
return v.charAt(0);
else return ' ';
}
}
, затем вы можете зарегистрировать его для всего пакета с помощью package-info.java (не забудьте его внутри какого-либо другого класса) или использовать его специально для определенного поля.
см. http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and для получения дополнительной информации.