以一个字符串加同步锁
LockData
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class LockData {private static List lockKeys;private static LockData lockData;static {lockData = new LockData();lockKeys = new ArrayList();Object lockKey = null;for(int i=0;i<10000;i++){lockKey = new Object();lockKeys.add(lockKey);}}/** * 加入值 * @param key * @return */public static synchronized Object requireLock(String key) {//System.out.println("size="+lockKeys.size());int a = key.hashCode() % 10000;System.out.println(a);Object lock = lockKeys.get(key.hashCode() % 10000);return lock;}}
public class TestLock implements Runnable {private String a;public TestLock(String a) {this.a = a;}public void run() {// TODO Auto-generated method stubtry {Object data = LockData.requireLock(a);//System.out.println("a="+a);synchronized (data) {//System.out.println("Thread name : "+Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//System.out.println("end" + a);}} finally {}}public static void main(String[] args) {for (int i = 0; i < 100000; i++) {TestLock ts = new TestLock("1");new Thread(ts,i+"").start();}}}