rLangth){ try{ this.wait(); //Thread.sleep(10); }catch(InterruptedException e){} } buffer[Rear]=value; Count++; Rear=(Rear+1)%bufferLangth; notifyAll(); } } // 生产者 class Sender extends Thread { private BufferLock buffer; public Sender(BufferLock buffer) { this.buffer=buffer; } //int i=buffer.Rear; public void run() {
while(true){
//利用 Java 同步机制实现管道机制。在完成生产之前,不允许别的进程访问 缓冲区 buffer synchronized(buffer){ buffer.set(buffer.i++); //控制消费者的消费速度 try{ Thread.sleep(10); }catch(InterruptedException e){} System.out.println("Set :"+(buffer.i-1)+" count:"+buffer.Count); } } } } //消费者 class Receiver extends Thread { private BufferLock buffer; public Receiver(BufferLock buffer) { this.buffer=buffer; } public void run() { while(true){ //利用 Java 同步机制实现管道机制,在完成生产之前,不允许别的进程访问 缓冲区 buffer synchronized(buffer){ buffer.get(); //控制消费者的消费速度 try{ Thread.sleep(10); }catch(InterruptedException e){} System.out.println("\t\tGot:"+buffer.value+" count:"+buffer.Count); } } } }
管程模式:(实际上就是对一个类对象方法进行同步处理,确保是线程安全的) 如果当多个线程同时访问同一
个类对象中的同一个普通方法时, 那么就会产生一些不规则的 错误现象出现。也就是说会出现多线程的死锁,活锁等现象。那么系统将无法进行下去(硬 盘灯会闪个不停)。
在 java 中可以使用同步的方法,来避免此事发生。即用 synchronized 修饰下你所写的方 法(修正:如果是特定变量,或者特定的函数涉及到了线程安全的时候,我们可以用 synchronized 进行修饰,从而确保了线程的安全性)。不过这种同步不推荐随意使用,因 为它要比非同步的方法在程序运行时间片上 慢了很多倍。必要情况下才出手啊。 呵呵,这种情况我有很深体会,记得大学时,写一个站点,担心多用户访问会出
问题,便在 每个函数上加了把锁头,俗不知在局域网内运行也有蜗牛般感觉,惭愧当时对 synchronized 理解不深入啊,一帮哥们直抱怨。 具体:public class Test{ public synchronized void synTest(){........}}