我有一个函数,供多线程来调用,其中有个参数是code。我想实现这样一个功能。
如果不同code的线程来调用这个函数,可以随便调用,没限制,但如果是同一个code的多个线程来调用,就需要同步一下,怎么用synchronized或其他方法实现呢?最好能有个例子,谢谢了啊!
如果不同code的线程来调用这个函数,可以随便调用,没限制,但如果是同一个code的多个线程来调用,就需要同步一下,怎么用synchronized或其他方法实现呢?最好能有个例子,谢谢了啊!
解决方案 »
- 如何用JAVA实现类似于QQ空间的分享功能?
- EL表达式 作为方法参数的问题 高手帮帮忙
- 关于酒店分房的算法
- 同样的应用部署在TOMCAT6下通过,在oracle weblogic10.3出现问题。
- ++++Spring 中的DispaterServlet 是怎么找到SimpleUrlHandlerMapping 这个bean实例的?
- 对字符串只遍历一次,实现对字符串指定的子串替换成指定串
- javaWeb中文乱码
- 50分请教各位JAVA高手1个小问题。急,求救!!分不够可以再给!!
- 真的很急,请各位懂websphere mq和java编程的帮忙,万分感谢,在线等
- 如何让java程序(或Jsp)定时自动执行?
- hibernate中表与类之间的映射问题?急 急 急 啊!!! 高手指点小弟啊
- struts2.0还是webwork
就按照我的理解来说一下吧.
如果是同一个code的多个线程来调用,就需要同步一下
没错,就是在调用该方法的方法,对这个的方法进行同步应该差不多了
不过很奇怪啊,只读的话就从根本上不存在同步不同步的问题啊.
是不是code具有同样的值就是同一个code,值不同就不是同一个?
然后设置一个map,key=code,value=new FunctionContainer();
每一次当某个code来调用该函数的时候你判断map.contains(code)如果存在则取出该类,并执行。如果不存在,这new FunctionContainer();放入map中并调用它的对应的函数。这样就应该实现你的想法了吧
举个例子,有个函数f(String code)
然后可能会有多个线程来调用这个函数,自然要把code传进来。如果有几个相同code的线程过来调用,那么要保证同一时间只有一个线程会执行函数f里的内容,如果有其他code的线程过来调用,则没有这个限制。。
3楼看来明白我的意思了,但办法不可取,因为实际情况中,code可能非常非常多,这种做法太占用内存。
2楼你的理解是正确的。
是不是因为那个final,就可以满足我的要求了?
需要同步执行的内容
}
比如现在同时启动了5个线程,其中有3个线程(设为线程1、2、3)中的code的内容是"a",还有1个(设为线程4)是"b",它们同时来调用f函数,我现在想要的效果就是,如果这时候线程1调用到了,那么2、3线程不能再调了,直到1调完了它们才能接着调用,但是线程4可以在同一时间调用f函数。
请问你的这个作法可以获得这个效果吗?
5楼这位兄弟的这个方法:synchronized f(final String code) 可以吗?
public static void f(String code)
{
// 不需要同步的内容 synchronized(code)
{
// 需要同步执行的内容
} // 不需要同步的内容}然后这个函数供多线程来调用。
这样写真的可以吗?我总觉得就算是相同值的参数code进来,也会被同步的,还请高手解释。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class RWLock {
private String code;
private ReadWriteLock rwLock;
public RWLock(){
rwLock = new ReentrantReadWriteLock();
}
public String getCode() {
Lock lock = rwLock.readLock();
try{
lock.lock();
return code;
}finally{
lock.unlock();
}
} public void setCode(String code) {
Lock lock = rwLock.writeLock();
try{
lock.lock();
this.code = code;
}finally{
lock.unlock();
}
}
}
1.当有线程进行访问时,你可以把当前的线程的CODE放入threadLocal中,好处是没个线程内的CODE值互不影响,因为threadloacl内的set(object o)方法的原理是根据thead.current做为map的关键字,CODE最为值,而且同一个线程在次保存值时不回重复.
2.当有线程要进行访问时,你可以通过threanlocal的get()方法(原理:根据当前的线程取出code),全部存入到一个map中
当要进行方法调用时,把map里的值全部取出来进行==判断,相等的则synchronized一下就可以了