同步与并发demo:增多吞吐量
同步与并发demo:增加吞吐量
package test.lock; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestConcurrent { private static final int LOCK_SIZE = 10; private static final Lock[] locks = new ReentrantLock[10]; private static final Map<String, List<String>> dataMap ; static { dataMap = new ConcurrentHashMap<String, List<String>>(); for (int i = 0; i < LOCK_SIZE; i++) { locks[i] = new ReentrantLock(); } } public int count(String userid) { final Lock lock = locks[userid.hashCode() & (LOCK_SIZE - 1)]; lock.lock(); try { List<String> list = null; list = dataMap.get(userid); if (list != null) { System.out.println(Thread.currentThread().getName() + ",userid:" + userid + ",get from cache"); } else { System.out.println(Thread.currentThread().getName() + ",userid:" + userid + ",get from db"); list = loadData(userid); dataMap.put(userid, list); } return list != null ? list.size() : 0; } finally { lock.unlock(); } } private List<String> loadData(String userid) { // 模拟耗时操作 // sleep 1s sleeper(1000); Random r = new Random(); List<String> list = new ArrayList<String>(); int size = r.nextInt(1000); for (int i = 0; i < size; i++) { list.add(i + ""); } return list; } private void sleeper(int time) { try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { final TestConcurrent t = new TestConcurrent(); ExecutorService executor = Executors.newCachedThreadPool(); executor.submit(new Task(t, new String(20 + ""))); executor.submit(new Task(t, new String(20 + ""))); executor.submit(new Task(t, new String(20 + ""))); executor.submit(new Task(t, new String(20 + ""))); executor.submit(new Task(t, new String(20 + ""))); executor.submit(new Task(t, new String(20 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(99 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(55 + ""))); executor.submit(new Task(t, new String(22 + ""))); executor.submit(new Task(t, new String(44 + ""))); executor.submit(new Task(t, new String(11 + ""))); executor.submit(new Task(t, new String(44 + ""))); executor.submit(new Task(t, new String(57 + ""))); executor.submit(new Task(t, new String(78 + ""))); executor.submit(new Task(t, new String(54 + ""))); executor.submit(new Task(t, new String(123 + ""))); executor.submit(new Task(t, new String(452 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(88 + ""))); executor.submit(new Task(t, new String(88 + ""))); } private static class Task implements Runnable { private TestConcurrent t; private String userid; public Task(TestConcurrent t, String userid) { this.t = t; this.userid = userid; } @Override public void run() { int result = t.count(userid); // TODO } } }
输出结果: pool-1-thread-1,userid:20,get from db pool-1-thread-8,userid:88,get from db pool-1-thread-24,userid:452,get from db pool-1-thread-22,userid:54,get from db pool-1-thread-3,userid:20,get from cache pool-1-thread-10,userid:88,get from cache pool-1-thread-2,userid:20,get from cache pool-1-thread-12,userid:88,get from cache pool-1-thread-6,userid:20,get from cache pool-1-thread-5,userid:20,get from cache pool-1-thread-14,userid:88,get from cache pool-1-thread-4,userid:20,get from cache pool-1-thread-16,userid:22,get from db pool-1-thread-21,userid:78,get from db pool-1-thread-18,userid:11,get from db pool-1-thread-7,userid:88,get from cache pool-1-thread-20,userid:57,get from db pool-1-thread-9,userid:88,get from cache pool-1-thread-11,userid:88,get from cache pool-1-thread-13,userid:99,get from db pool-1-thread-26,userid:88,get from cache pool-1-thread-15,userid:55,get from db pool-1-thread-28,userid:88,get from cache pool-1-thread-17,userid:44,get from db pool-1-thread-19,userid:44,get from cache pool-1-thread-23,userid:123,get from db pool-1-thread-27,userid:88,get from cache pool-1-thread-25,userid:88,get from cache pool-1-thread-29,userid:88,get from cache