⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testconcurrency.java

📁 一个不错的cache
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2002-2003 by OpenSymphony * All rights reserved. */package com.opensymphony.oscache.base;import com.opensymphony.oscache.general.GeneralCacheAdministrator;import junit.framework.Test;import junit.framework.TestCase;import junit.framework.TestSuite;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import java.util.BitSet;import java.util.Properties;/** * Test the Cache class for any concurrency problems * * $Id: TestConcurrency.java,v 1.5.2.1 2005/04/30 21:35:02 dres Exp $ * @version        $Revision: 1.5.2.1 $ * @author <a href="mailto:chris@chris.com">Chris Miller</a> */public class TestConcurrency extends TestCase {    private static transient final Log log = LogFactory.getLog(GeneralCacheAdministrator.class); //TestConcurrency.class    // Static variables required thru all the tests    private static GeneralCacheAdministrator admin = null;    // Constants needed in the tests    private final String KEY = "key";    private final String VALUE = "This is some content";    private final int ITERATION_COUNT = 5; //500;    private final int THREAD_COUNT = 6; //600;    private final int UNIQUE_KEYS = 1013;    /**     * Class constructor.     * <p>     * @param str The test name (required by JUnit)     */    public TestConcurrency(String str) {        super(str);    }    /**     * This method is invoked before each testXXXX methods of the     * class. It set ups the variables required for each tests.     */    public void setUp() {        // At first invocation, create a new Cache        if (admin == null) {            Properties config = new Properties();            config.setProperty(AbstractCacheAdministrator.CACHE_CAPACITY_KEY, "70");            config.setProperty(AbstractCacheAdministrator.CACHE_BLOCKING_KEY, "false");            admin = new GeneralCacheAdministrator();            assertNotNull(admin);        }    }    /**     * This methods returns the name of this test class to JUnit     * <p>     * @return The name of this class     */    public static Test suite() {        return new TestSuite(TestConcurrency.class);    }    /**     * Check that the cache handles simultaneous attempts to access a     * new cache entry correctly     */    public void testNewEntry() {        String key = "new";        try {            admin.getFromCache(key, -1);            fail("NeedsRefreshException should have been thrown");        } catch (NeedsRefreshException nre) {            // Fire off another couple of threads to get the same cache entry            GetEntry getEntry = new GetEntry(key, VALUE, -1, false);            Thread thread = new Thread(getEntry);            thread.start();            getEntry = new GetEntry(key, VALUE, -1, false);            thread = new Thread(getEntry);            thread.start();            // OK, those threads should now be blocked waiting for the new cache            // entry to appear. Sleep for a bit to simulate the time taken to            // build the cache entry            try {                Thread.sleep(500);            } catch (InterruptedException ie) {            }            // Putting the entry in the cache should unblock the previous threads            admin.putInCache(key, VALUE);        }    }    /**     * Check that the cache handles simultaneous attempts to access a     * new cache entry correctly     */    public void testNewEntryCancel() {        String key = "newCancel";        String NEW_VALUE = VALUE + "...";        try {            admin.getFromCache(key, -1);            fail("NeedsRefreshException should have been thrown");        } catch (NeedsRefreshException nre) {            // Fire off another thread to get the same cache entry            GetEntry getEntry = new GetEntry(key, NEW_VALUE, -1, true);            Thread thread = new Thread(getEntry);            thread.start();            // The above thread will be blocked waiting for the new content            try {                Thread.sleep(500);            } catch (InterruptedException ie) {            }            // Now cancel the update (eg because an exception occurred while building the content).            // This will unblock the other thread and it will receive a NeedsRefreshException.            admin.cancelUpdate(key);            // Wait a bit for the other thread to update the cache            try {                Thread.sleep(500);            } catch (InterruptedException ie) {            }            try {                Object newValue = admin.getFromCache(key, -1);                assertEquals(NEW_VALUE, newValue);            } catch (NeedsRefreshException e) {                admin.cancelUpdate(key);                fail("A NeedsRefreshException should not have been thrown");            }        }    }    /**     * Verify that we can concurrently access the cache without problems     */    public void testPut() {        Thread[] thread = new Thread[THREAD_COUNT];        for (int idx = 0; idx < THREAD_COUNT; idx++) {            OSGeneralTest runner = new OSGeneralTest();            thread[idx] = new Thread(runner);            thread[idx].start();        }        boolean stillAlive;        do {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                // do nothing            }            stillAlive = false;            int i = 0;            while ((i < thread.length) && !stillAlive) {                stillAlive |= thread[i++].isAlive();            }        } while (stillAlive);    }    /**     * Check that the cache handles simultaneous attempts to access a     * stale cache entry correctly     */    public void testStaleEntry() {        String key = "stale";        assertFalse("The cache should not be in blocking mode for this test.", admin.isBlocking());        admin.putInCache(key, VALUE);        try {            // This should throw a NeedsRefreshException since the refresh            // period is 0            admin.getFromCache(key, 0);            fail("NeedsRefreshException should have been thrown");        } catch (NeedsRefreshException nre) {            // Fire off another thread to get the same cache entry.            // Since blocking mode is currently disabled we should            // immediately get back the stale entry            GetEntry getEntry = new GetEntry(key, VALUE, 0, false);            Thread thread = new Thread(getEntry);            thread.start();            // Sleep for a bit to simulate the time taken to build the cache entry            try {                Thread.sleep(200);            } catch (InterruptedException ie) {            }            // Putting the entry in the cache should mean that threads now retrieve            // the updated entry            String newValue = "New value";            admin.putInCache(key, newValue);            getEntry = new GetEntry(key, newValue, -1, false);            thread = new Thread(getEntry);            thread.start();            try {                Object fromCache = admin.getFromCache(key, -1);                assertEquals(newValue, fromCache);            } catch (NeedsRefreshException e) {                admin.cancelUpdate(key);                fail("Should not have received a NeedsRefreshException");            }            // Give the GetEntry thread a chance to finish            try {                Thread.sleep(200);            } catch (InterruptedException ie) {            }        }    }    /**     * A test for the updating of a stale entry when CACHE.BLOCKING = TRUE     */    public void testStaleEntryBlocking() {        // A test for the case where oscache.blocking = true        admin.destroy();        Properties p = new Properties();        p.setProperty(AbstractCacheAdministrator.CACHE_BLOCKING_KEY, "true");        admin = new GeneralCacheAdministrator(p);        assertTrue("The cache should be in blocking mode for this test.", admin.isBlocking());        // Use a unique key in case these test entries are being persisted

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -