@Override public Object call() throws Exception { Random rnd = new Random(); while(!stop.get()) { if (rnd.nextBoolean()) { if (!lock.tryBeginUpdate()) continue; } else lock.beginUpdate(); int n = 1 + rnd.nextInt(1000); if (rnd.nextBoolean()) x.addAndGet(n); else y.addAndGet(n); z.addAndGet(n); lock.endUpdate(); } return null; } }, 15, "update");
/** * Signal that update operation finished. */ public void endUpdate() { Sync<X> sync0 = sync; if (sync0.releaseAfterUpdate()) takeSnapshotAndReplaceSync(sync0); }
/** * @param sync0 Current sync. */ private void takeSnapshotAndReplaceSync(Sync<X> sync0) { try { sync0.set(doSnapshot(), null); } catch (RuntimeException e) { sync0.set(null, e); } finally { sync = new Sync(); sync0.signalAll(); } }
@Override public Object call() throws Exception { while(!stop.get()) { T3<Long, Long, Long> t; try { t = lock.snapshot(); } catch (IgniteException e) { assertEquals(oops, e.getMessage()); continue; } assertEquals(t.get3().longValue(), t.get1() + t.get2()); } return null; } }, 8, "snapshot");
/** * @param sync0 Current sync. */ private void takeSnapshotAndReplaceSync(Sync<X> sync0) { try { sync0.set(doSnapshot(), null); } catch (RuntimeException e) { sync0.set(null, e); } finally { sync = new Sync(); sync0.signalAll(); } }
/** * @return Consistent snapshot of data. */ public X snapshot() { Sync<X> sync0 = sync; if (sync0.flip()) takeSnapshotAndReplaceSync(sync0); return sync0.get(); }
/** * Signal that update operation finished. */ public void endUpdate() { Sync<X> sync0 = sync; if (sync0.releaseAfterUpdate()) takeSnapshotAndReplaceSync(sync0); }
/** * @return Consistent snapshot of data. */ public X snapshot() { Sync<X> sync0 = sync; if (sync0.flip()) takeSnapshotAndReplaceSync(sync0); return sync0.get(); }