最近在一个需求中 遇到 say(int a) ,有N个线程对这个函数进行访问,不需要对有所线程进行同步,但是当a值相同的线程要进行同步。
之前所看到synchronized 都是 根据对象锁进行同步。 现在要做的是根据值进行同步。
synchronized( object) object 相同时会进行同步, 实现 synchronized(value) 普通的值相同也进行同步。
以上是用来同步的类
上面是测试类。
对线程了解不多。
之前所看到synchronized 都是 根据对象锁进行同步。 现在要做的是根据值进行同步。
synchronized( object) object 相同时会进行同步, 实现 synchronized(value) 普通的值相同也进行同步。
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Semaphore;
/**
* @author NuABO
* @version 创建时间:2011-4-20 下午06:19:06 类说明
* @param <T>
* @param <T>
*/
public abstract class ValueSynLock<T> {
/**
* @Fields signMap : TODO(存储一个同步信号量,key表示同步的值)
*/
private static ConcurrentMap<Object, Semaphore> signMap = new ConcurrentHashMap<Object, Semaphore>();
/**
* 要执行的方法
*/
public abstract void run();
/**
* 开始执行操作
* @param value
*/
public void startWork(T value) {
Semaphore se = putMapAndGetSemaphore(value);
try {
se.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
run();
releaseLockMap(value);
se.release();
}
/**
* 释放map
* @param
*/
public void releaseLockMap(T a) {
Semaphore se = signMap.get(a);
if (se != null) {
signMap.remove(a);
}
}
/**
*
* @param 放入同步值,获取同步信号量
* @return
*/
public Semaphore putMapAndGetSemaphore(T value) {
Semaphore se = signMap.get(value);
if (se == null) {
se = new Semaphore(1);
signMap.put(value, se);
}
return signMap.get(value);
}
}
以上是用来同步的类
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author NuABO
* @version 创建时间:2011-4-18 下午04:47:27 类说明
*/
public class Test {
public static void main(String[] args) {
final ValueSynLock<String> vsl= new thread.ValueSynLock<String>(){
public void run( ){
/************ 你要进行同步的代码块********************/
int i=100;
while(i-->0){
System.out.println(Thread.currentThread().getName()+"-----"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/********************************/
}};
ExecutorService service=Executors.newCachedThreadPool();
for(int i=0;i<5;i++)
service.execute(new Runnable(){public void run(){
vsl.startWork("1"); //startWork(参数值 相同就会同步【根据值进行同步】)
}});
for(int i=0;i<5;i++){
service.execute(new Runnable(){public void run(){
vsl.startWork("2"); //startWork(参数值 相同就会同步【根据值进行同步】)
}});
}
}
上面是测试类。
对线程了解不多。