求一个比较优秀的多线程算法!
多线程服务器,可同时向多个客户端发送信息,信息存放在byte[]缓存中,服务器可以修改缓存,如果修改此缓存的同时,正在读取并发送缓存里的信息,那么就可能出现问题!目标是要实现服务器改写缓存的时候,任何线程都不能读取缓存,而服务器不改写缓存的时候,多个线程可以同时读取缓存,请问有没有什么好的算法或者设计模式可以实现以上功能? 问题点数:20、回复次数:7Top
1 楼lbfhappy(千里冰封)回复于 2006-05-04 18:50:19 得分 0
可以在服务器写缓存的时间,设置一个标志,说明此时此文件正在被服务器所修改,所有的线程都不能访问,当服务器写完了以后,就把这个标志设为可以就行了
这个标志可以是一个文件,也可以是内存里的一个变量Top
2 楼PiouseLeo(永不褪色的SB )回复于 2006-05-04 19:12:09 得分 0
但是如果已经有线程开始读取缓存了(并未读完),此时服务器要修改缓存怎么办?Top
3 楼bbflyerwww()回复于 2006-05-04 20:15:09 得分 0
即使感觉上的同时读,实际上也不是同时的。多线程实际上就类似一个多个线程的时间片轮转吧。所以设置成进程同步应该没问题吧 synchronizedTop
4 楼ErikChen1985()回复于 2006-05-04 22:45:01 得分 0
有看过一本书《Java多线程设计模式》吗?这个就叫Read-Write Lock Pattern。就是读的时候没有线程冲突问题,写就有。这时候就要自己写一个管理线程冲突的类。代码我就不发了,很长。Top
5 楼jshi123()回复于 2006-05-05 10:08:21 得分 20
public class Buffer {
static private byte[] buffer = new byte[..];
static Lock readLock = new ReentrantLock();
static Condition canWrite = lock.newCondition();
static int writeLock = 0;
public void writeBuffer() throws InterruptedException {
readLock.lock();
try {
while (writeLock > 0) {
canWrite.await();
}
doWriteBuffer(...);
}
finally {
readLock.unlock();
}
}
public void readBuffer() throws InterruptedException {
readLock.lock();
writeLock ++;
readLock.unlock();
try {
doReadBuffer(...);
}
finally {
writeLock--;
canWrite.signal();
}
}
}
Top
6 楼greenkugua(跋涉者)回复于 2006-05-05 22:36:00 得分 0
你看看操作系统就知道并发控制了,这个一般大学操作系统课都讲的很明白的Top
7 楼ErikChen1985()回复于 2006-05-05 22:54:57 得分 0
那也不用看操作系统这么夸张,看看多线程设计模式就可以了。Top




