在java中对字符串方法参数同步io操作?
基本上,我有一个包含两个方法的类:一个用于将对象序列化为XML文件,另一个用于从XML读取对象。 以下是还原对象的方法中的同步部分示例:在java中对字符串方法参数同步io操作?,java,multithreading,synchronization,io,Java,Multithreading,Synchronization,Io,基本上,我有一个包含两个方法的类:一个用于将对象序列化为XML文件,另一个用于从XML读取对象。 以下是还原对象的方法中的同步部分示例: public T restore(String from) throws Exception { // variables declaration synchronized (from) { try { decoder = new XMLDecoder(new Buffe
public T restore(String from) throws Exception {
// variables declaration
synchronized (from) {
try {
decoder = new XMLDecoder(new BufferedInputStream(
new FileInputStream(from)));
restoredItem = decoder.readObject();
decoder.close();
} catch (Exception e) {
logger.warning("file not found or smth: " + from);
throw new Exception(e);
}
}
// try to cast it
}
序列化对象时也会采用类似的方法。现在,当我创建一个单元测试,然后创建10个线程,每个线程尝试序列化并立即读取布尔值或字符串时,它将无法显示发生了ClassCastException。这让我觉得序列化是错误的(在单线程环境中一切正常)。如果您一直支持我到现在:),以下是我需要您帮助的两个问题:
鉴于代码的某些部分丢失,我敢打赌问题在于在字符串上进行同步。您不能随意假定字符串是池化的(这将破坏您的同步方案) 最好的方法是添加一个将键(字符串)与其实际同步对象关联的映射
除此之外,我建议使用多线程测试,看看是什么导致它失败。例如,如果让所有线程只存储字符串值(而不是字符串或beooleans),测试是否仍然失败?鉴于代码的某些部分丢失,我敢打赌问题在于对字符串进行同步。您不能随意假定字符串是池化的(这将破坏您的同步方案) 最好的方法是添加一个将键(字符串)与其实际同步对象关联的映射
除此之外,我建议使用多线程测试,看看是什么导致它失败。例如,如果让所有线程只存储字符串值(而不是字符串或beooleans),测试是否仍然失败?这种方法存在许多问题
最后,是要同步访问共享文件,还是在检测到对同一文件的多次访问时失败 这种方法存在许多问题
最后,是要同步访问共享文件,还是在检测到对同一文件的多次访问时失败 一个字符串不能构成一个好的互斥体,但可以用来创建一个:。一个字符串不能构成一个好的互斥体,但可以用来创建一个:。1。 是的,可以在字符串上同步,但是需要在字符串上同步。为了始终得到相同的对象
StringBuffer sb = new StringBuffer(); sb.append("a").append("b");
String a = new String(sb.toString());
String b = new String(sb.toString());
a == b; //false
a.equals(b); //true
a.intern() == b.intern(); //true
由于要在同一个监视器上同步,因此需要intern()
二,。
您可能不希望在字符串上进行同步,因为它可能在其他地方、代码内部、第三方或JRE中进行同步。我会怎么做,我