本帖最后由 庄星睿 于 2012-6-23 11:43 编辑
多个生产者这块视频看了几遍了,有几个问题越想越糊涂,我是这样实现的:视频里创建多个生产者、消费者这样写的
Thread t1=new Thread(per);
Thread t2=new Thread(per); //生产者2
Thread t3=new Thread(con);
Thread t4=new Thread(con); //消费者2
那个生产者和消费者不是两个独立的对象吗,要增加生产者,消费者,得先创建生产者、消费者对象:
Producer per=new Producer(r);
Producer per2=new Producer(r); //这样增加一个生产者对象
Consumer con=new Consumer(r);
Consumer con2=new Consumer(r); //这样增加一个消费者对象
Thread t1=new Thread(per);
Thread t2=new Thread(per2); //增加一个生产者线程
Thread t3=new Thread(con);
Thread t4=new Thread(con2); //增加一个消费者线程
问题一:
这样写,我能实现和视频里的一样的状态,增加了生产者、消费者增加了相应的线程,但和视频里直接Thread有什么区别,感觉直接Thread好像将原来的复制了
问题二:
我的理解上就是 Input Ouput 情况,先存入、后取出,加了同步防止同时操作Resource出现数据错乱,就好比有一个房间,有两个门(存和取),一个人从一个门往房间里存东西,另一个人从房间另一扇门取东西,加了同一把锁,同一时间段完成只能存入或只能取出动作,避免数据错乱,加了flag判断标记,让存入和取出交替进行,防止某个时间段重复执行存入或取出操作,现在又增加了一个生产者和消费者,就相当于又增加了一个input ouput,两个人存取操作,这时t1 ,t2,t3,t4,都持有相同的锁,相当于还是同时在一个房间里存取啊,那么既然t1线程拿了锁进去执行 wait()了,这时t2应该进不去啊,因为t1还没出来(按照那个火车上厕所的例子理解),t3进去从取的那个门取出数据,如果t3拿锁挂了,没出来,t4应该也进不去啊,他得等t3出来改了旗标才能进去 啊 ,就是说一个时间段内只能一个人在存或取
他这里是用同步函数实现的,怎里理解那个同步函数什么时候才算拿锁了就相当于 synchronized(obj){}是进代码块里拿锁,出代码块释放锁,那个同步函数呢,什么时候算拿,什么时候算释放 ?
|