--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.db.tests.performance.java;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.simantics.db.testing.base.TestCommonPerf;
+
+
+/**
+ *
+ */
+public class ThreadLocalTest extends TestCommonPerf {
+
+ public void test() throws Exception {
+
+ final ThreadLocal<AtomicInteger> local = new ThreadLocal<AtomicInteger>();
+
+ class CounterThread extends Thread {
+
+ final private Semaphore start;
+ final private AtomicInteger counter;
+ final private CountDownLatch latch;
+
+ public CounterThread(Semaphore start, CountDownLatch latch, AtomicInteger counter) {
+ this.start = start;
+ this.counter = counter;
+ this.latch = latch;
+ }
+
+ @Override
+ public void run() {
+
+ local.set(new AtomicInteger());
+
+ try {
+ start.acquire();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ int work = 0;
+ for(int i=0;i<1000000;i++) {
+ for(int j=0;j<100;j++) local.get().incrementAndGet();
+ }
+
+ latch.countDown();
+
+ System.out.println("work=" + work);
+
+ }
+
+ }
+
+ CountDownLatch latch = new CountDownLatch(8);
+ AtomicInteger counter = new AtomicInteger(0);
+ Semaphore starter = new Semaphore(0);
+
+ for(int i=0;i<8;i++) new CounterThread(starter, latch, counter).start();
+
+ Thread.sleep(500);
+
+ starter.release(8);
+ long start = System.nanoTime();
+ latch.await();
+ long duration = System.nanoTime() - start;
+
+ System.out.println("counter=" + counter.get());
+
+ System.out.println("Finished in " + 1e-9*duration + "s.");
+
+ }
+
+ public void test2() throws Exception {
+
+ class CounterThread extends Thread {
+
+ final private Semaphore start;
+ final private AtomicInteger counter;
+ final private CountDownLatch latch;
+
+ public CounterThread(Semaphore start, CountDownLatch latch, AtomicInteger counter) {
+ this.start = start;
+ this.counter = counter;
+ this.latch = latch;
+ }
+
+ @Override
+ public void run() {
+
+ AtomicInteger ai = new AtomicInteger();
+
+ try {
+ start.acquire();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ int work = 0;
+ for(int i=0;i<1000000;i++) {
+ for(int j=0;j<100;j++) ai.incrementAndGet();
+ }
+
+ latch.countDown();
+
+ System.out.println("work=" + work);
+
+ }
+
+ }
+
+ CountDownLatch latch = new CountDownLatch(8);
+ AtomicInteger counter = new AtomicInteger(0);
+ Semaphore starter = new Semaphore(0);
+
+ for(int i=0;i<8;i++) new CounterThread(starter, latch, counter).start();
+
+ Thread.sleep(500);
+
+ starter.release(8);
+ long start = System.nanoTime();
+ latch.await();
+ long duration = System.nanoTime() - start;
+
+ System.out.println("counter=" + counter.get());
+
+ System.out.println("Finished in " + 1e-9*duration + "s.");
+
+ }
+
+}