11 java 王少飞-线程同步通信总结

来源:互联网 发布:mac玩倩女幽魂手游 编辑:程序博客网 时间:2024/06/10 06:43

线程同步通信
    两个或两个以上的线程处理同一个资源,处理的动作是不一样的,这样就需要将不同的动作代码放到不同的run方法中,run方法要封装到单独的类中。

实例-------------
   生产者-消费者问题是多线程同步处理的典型问题:
   有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止。
   因此需要注意以下几点:
   1)线程B写一次,线程A读一次
   2)在某个时候线程B运行速度比较快,在线程A未读取上一个数据之前,B就写了第二次数据,造成数据遗漏。
   3)在某个时候线程A运行速度比较快,它读完一次数据之后,线程B还没来得及写,线程A又来读第二次。结果线程A读不到数据,导致运行出错。
   4)线程B正在写数据时,线程A也来读取数据,这时可能线程B还没将数据写完,线程A将数据读走,导致程序出错。
  
   解决生产者消费者问题的方法:
   1)采用某种机制保持生产者和消费者之间的同步,即线程的同步解决生产者-消费者问题:
     限制公共缓冲区不能被两个线程同时访问,需要使用互斥锁,即用synchronized来标识同步资源。但加了互斥锁以后有可能会造出死锁,这时需要wait()方法和notify()方法让当前线程被阻塞并释放该对象的互斥锁。
     为避免死锁,就应该让线程在进入阻塞状态时尽量释放其锁定的资源,以为其他的线程提供运行的机会,Object类中定义了几个有用的方法:
1)wait()--------
     wait():被锁定的对象可以调用wait()方法,这将导致当前线程被阻塞并释放该对象的互斥锁,即解除了wait()方法当前对象的锁定状态,其他的线程就有机会访问该对象。
2)notify()------
     notify():唤醒调用wait()方法后被阻塞的线程。每次运行该方法只能唤醒一个线程。
3)notifyAll()---
     notifyAll():唤醒所有调用wait()方法被阻塞的线程。
   2)在生产者和消费者之间建立一个管道
  


 

原创粉丝点击