/******************************************************************************* * 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 local = new ThreadLocal(); 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."); } }