`
uusoft
  • 浏览: 10602 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JDK 5.0中的Lock实现线程同步

    博客分类:
  • j2se
 
阅读更多

JDK 5中将synchronized替换成现实的Lock,将Object中的wait notify notofyAll替换成Condition中的await signal signalAll。Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用.
import java.util.concurrent.locks.*;
class ProducerConsumerDemo1 
{
	public static void main(String[] args) 
	{
		Resource res=new Resource();
		
		Producer pro=new Producer(res);
		Consumer con=new Consumer(res);

		Thread t1=new Thread(pro);
		Thread t2=new Thread(pro);
		Thread t3=new Thread(con);
		Thread t4=new Thread(con);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
	}
}


class Resource 
{
	private String name;
	private int count=1;
	private boolean flag=false;
	private Lock lock=new ReentrantLock();
	Condition conditionPro=lock.newCondition();
	Condition conditionCon=lock.newCondition();
	public  void set(String name)
	{   
		lock.lock();
		
			try
				{
				while(flag)
					{
				      conditionPro.await();
					}
			     this.name=name+"--"+count++;
		         System.out.println(Thread.currentThread().getName()+" 生产者。。。。"+this.name);
		         flag=true;
				 conditionCon.signal();//唤醒
			    }
			catch(InterruptedException e){}
			finally
			    {
		               lock.unlock();
			    }
		
		
		
	}

	public synchronized void out()
	{   
        lock.lock();

		try
		{
			while(!flag)
			{
				conditionCon.await();
			}
         System.out.println(Thread.currentThread().getName()+" 消费者。。。。。。。"+name);
		 flag=false;
         conditionPro.signal();//唤醒
		}
		catch (InterruptedException e)
		{
		}
		finally
                  {
                   lock.unlock();
                  }
		
	}
}

class Producer implements Runnable
{
	Resource res;
	public Producer(Resource res)
	{
		this.res=res;
	}

	public void run()
	{
		while(true)
		{
			res.set("商品+");
		}
	}
}

class Consumer implements Runnable
{
	Resource res;
	public Consumer(Resource res)
	{
		this.res=res;
	}

	public void run()
	{
		while(true)
		{
			res.out();
		}
	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics