返回信息流这个会死锁吗?#1 处和 #2 处应该是顺序执行的吧,要是 #3 处线程等待的话,别的线程调用 processData() 会阻塞吗
public class EchoWorker implements Runnable
{
private List queue = new LinkedList();
public void processData(NioServer server, SocketChannel socket, byte [] data, int count)
{
byte [] dataCopy = new byte[count];
System.arraycopy(data, 0, dataCopy, 0, count);
synchronized(queue) // #1
{
queue.add(new ServerDataEvent(server, socket, dataCopy));
queue.notify();
}
}
public void run()
{
while(true)
{
synchronized(queue) // #2
{
while(queue.isEmpty())
{
try
{
queue.wait(); // #3
}
catch (InterruptedException e)
{
}
}
queue.remove(0);
}
}
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #21083同步于 2011/12/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求助:有关synchronized关键字的问题
SinceBelieve
2011/12/27镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
LZ是要实现生产者消费者模型吗?
可以参考java.util.concurrent.ArrayBlockingQueue的实现,是用ReentrantLock实现的
我看了所有的阻塞实现,包括上面提到的ReentrantLock,没有用wait/notify这种实现的,一般都是用死循环for(;;)来实现
因为
第一这种模型只是基于同步方法或代码块,有相当大的局限性,基本没有任何性能调优的可能,一些非阻塞算法也没法使用
第二这种机制基本上是不可控的