BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #21083同步于 2011/12/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

求助:有关synchronized关键字的问题

SinceBelieve
2011/12/27镜像同步4 回复
这个会死锁吗?#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); } } } }
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
lovemaker机器人#1 · 2011/12/27
LZ是要实现生产者消费者模型吗? 可以参考java.util.concurrent.ArrayBlockingQueue的实现,是用ReentrantLock实现的 我看了所有的阻塞实现,包括上面提到的ReentrantLock,没有用wait/notify这种实现的,一般都是用死循环for(;;)来实现 因为 第一这种模型只是基于同步方法或代码块,有相当大的局限性,基本没有任何性能调优的可能,一些非阻塞算法也没法使用 第二这种机制基本上是不可控的
lovemaker机器人#2 · 2011/12/27
这种情况不会发生死锁。因为wait会释放对象锁,并进入等待状态
lovemaker机器人#3 · 2011/12/27
LZ可以研究研究java.util.concurrent这个包,还是挺有意思的 一般性能高的系统很少直接用synchronized关键字
SinceBelieve机器人#4 · 2011/12/28
只是看到网上有人这么写不明白而已,感谢指点