Java同步方法未锁定对象

聚苯乙烯

我编写了一个Java程序来为文件中的每一行生成唯一的ID。可能有多个运行相同程序的作业获得唯一的ID。该ID对于任何文件中的每一行都必须是唯一的。我试图通过将值序列化到文件来实现这一点。由于多个作业将使用该程序,因此我使该方法同步。代码对单个作业正常运行,但是当尝试同时运行多个作业时,同步方法将失败。好像已经有一个对象正在运行时,在同一个对象上再次调用了方法。为什么同步方法不锁定对象?

以下是我编写的ID生成代码–

public class CreateId2 implements Serializable {

private static final long serialVersionUID = 1L;
private long i;

public synchronized long idGenerate() {

    long k = this.generateId(this);
    return k;

}
private long generateId(CreateId2 id){

    long returnedVal = id.getI();
    try {
    returnedVal = id.readObject();
    //System.out.println("previous modiefiied returnedVal is" + returnedVal);
    } catch (FileNotFoundException  ex) {
        id.setI(200L); //start from 200 for the first time
        returnedVal=id.getI();
    } catch (Exception ex2) {
        ex2.printStackTrace();
    }
    returnedVal = returnedVal +1;
    id.setI(returnedVal);
    //System.out.println("returnedVal is " + returnedVal);
    try {
    id.saveObject(id);
    } catch (Exception ex3) {
        ex3.printStackTrace();

        }
    return returnedVal;
}

public void saveObject(CreateId2 id) throws IOException{
    //System.out.println("saving object " + id.getI());
    File savedFileName = new File("C:\\Users\\sam\\Desktop\\tests\\test.ser");
    FileOutputStream savedOutput = new FileOutputStream(savedFileName);
    ObjectOutputStream oos = new ObjectOutputStream(savedOutput);

    oos.writeObject(id);
    oos.flush();
    // close the writing.
    oos.close();
    //System.out.println("saved. value is " + id.getI());
}

public long readObject() throws IOException, ClassNotFoundException{
    //System.out.println("read object is called. value is " + ci2.getI());

    File savedFileName = new File("C:\\Users\\sam\\Desktop\\tests\\test.ser");
    FileInputStream savedInput = new FileInputStream(savedFileName);
    ObjectInputStream ois = new ObjectInputStream(savedInput);

    //long val = Long.parseLong(ois.readObject().toString());

    CreateId2 ci2 = (CreateId2) ois.readObject();
    //System.out.println("value of valtemp " + ci2.getI());
    long val = Long.valueOf(ci2.getI());

    ois.close();
    return val;
    // close the writing.

}

public  long getI() {
    return i;
}

public void setI(long i) {
    this.i = i;
    //CreateId2.i = i;
}

// setter methods

private static CreateId2 instance = null;
private CreateId2() { }
public static CreateId2 getInstance() {
   if (instance == null) {
       instance = new CreateId2();
   }
   return instance;
}

}

我这样称呼这种方法-

CreateId2 id = CreateId2.getInstance();
long j = id.idGenerate();

当我同时调用此方法时,出现以下错误。另外,生成的ID不再是唯一的。

java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2325)
    at java.io.ObjectInputStream$BlockDataInputStream.readUnsignedShort(ObjectInputStream.java:2806)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2864)
    at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1072)
    at java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:704)
    at java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:830)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1601)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at helperPackage.CreateId2.readObject(CreateId2.java:66)
    at helperPackage.CreateId2.generateId(CreateId2.java:23)
    at textFile.RandomTest.main(RandomTest.java:18)
吉姆·加里森

synchronized仅适用于在同一个JVM中在同一个对象上同步的两个类。如果您有监视对象的多个实例,或者在多个JVM中运行,或者在每个作业都有自己的类加载器的批处理系统下运行,synchronized则将无法使用。使用4类UUID,它们是随机的128位值,“保证”是唯一的。

(从某种意义上讲,即使您在整个宇宙时代每秒生成一百万个UUID,也要保证不会发生碰撞)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java同步和对象锁定

来自分类Dev

同步方法可能未释放锁定

来自分类Dev

从对象锁定方法(Java)

来自分类Dev

JPA乐观锁定与同步Java方法

来自分类Dev

同步对象:锁定代码与锁定对象

来自分类Dev

Java并发性问题-锁定和同步方法

来自分类Dev

扩展类同步方法锁定

来自分类Dev

同步方法是否对此锁定

来自分类Dev

Java中方法,对象,类的同步

来自分类Dev

Java中的同步(对象和静态方法)

来自分类Dev

Java中对象的非同步方法?

来自分类Dev

同步是否锁定结果集对象?

来自分类Dev

锁定对象的最佳方法

来自分类Dev

Java-跨多个文件的同步/锁定

来自分类Dev

在Eclipse中,如何查找锁定特定类实例的所有Java同步块/方法

来自分类Dev

在Eclipse中,如何查找锁定特定类实例的所有Java同步块/方法

来自分类Dev

实例的同步方法可以被同步语句锁定吗

来自分类Dev

进入非同步块时,同步方法是否释放锁定?

来自分类Dev

在Java中同步对象

来自分类Dev

跨对象的Java同步

来自分类Dev

跨对象的Java同步

来自分类Dev

Java中的对象同步

来自分类Dev

Java Thread:对象具有同步方法和非同步方法

来自分类Dev

为什么这个简单的Java同步代码块示例根据锁定的对象为我提供不同的输出?

来自分类Dev

如何使Java对象同步?哪种方法更好,为什么?

来自分类Dev

Java同步方法未同步

来自分类Dev

Java同步方法未同步

来自分类Dev

锁定字典对象的正确方法

来自分类Dev

同步块中的静态和非静态锁定对象