1

ObjectDB でアトミック カウンターが必要ですが、次のコードは期待どおりに動作しません。

    final EntityManagerFactory emf = Persistence.createEntityManagerFactory("test.odb");
    EntityManager em = emf.createEntityManager();
    Point p = new Point(0, 0);
    em.getTransaction().begin();
    em.persist(p);
    em.getTransaction().commit();
    em.close();
    final CountDownLatch l = new CountDownLatch(100);
    for (int i = 0; i < 100; i++) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                EntityManager em = emf.createEntityManager();
                em.getTransaction().begin();
                //Query q = em.createQuery("UPDATE Point SET x = x + 1");
                Query query = em.createQuery("UPDATE Point SET x = x + 1");
                query.executeUpdate();
                em.getTransaction().commit();
                em.close();
                l.countDown();                    
            }
        });
        t.start();
    }
    l.await();
    em = emf.createEntityManager();
    TypedQuery<Point> myquery = em.createQuery("SELECT p from Point p", Point.class);
    List<Point> results = myquery.getResultList();
    System.out.println("X coordiate is: " + results.get(0).getX());
    em.close();

X 座標が 100 であると出力されたはずですが、実際にはそうではありません。

コードの何が問題になっていますか?

4

2 に答える 2

0

Point の DAO クラスを作成し、代わりに関数でpersist(), merge()... 関数をラップすることをお勧めしsynchronizedます。

または、同期とロックを必要とせずに問題を解決する必要がありますAtomicIntegergetAndIncrement()

于 2014-07-23T14:54:42.687 に答える