jdk1.5多线程的实现的方式:
jdk1.5之前对锁的操作是隐式的
synchronized(对象) //获取锁
{

} //释放锁

jdk1.5锁的操作是显示的:在包java.util.concurrent.locks中含有多线程实现方式相关的接口和类。
有一个描述锁的Lock接口,也就是把锁面向对象了

使用Lock接口的子类ReentrantLock创建一把锁
Lock lock = new ReentrantLock();
使用Lock替代同步代码块的方式:
1:创建一把锁
2:把之前写在同步代码块中的代码写在lock()和unlock()之间

用lock替代同步代码块之后出现了IllegalMonitorStateException(无效的监视器状态异常)
因为wait(),notifyAll()必须用在同步中,而同步被Lock替代了,所以出现异常

jdk1.5对唤醒等待方法也进行了单独的描述,描述的接口是Condition。
唤醒等待方法必须结合锁来使用,所以使用Lock的newCondition()方法来获取和锁绑定的Condition对象。

下面使用jdk1.5多线程的实现方式,解决一次唤醒所有线程性能低的问题。

 import java.util.concurrent.locks.*;
class Product
{
private String name;
private int count;
private boolean flag; //创建一把锁
private Lock lock = new ReentrantLock(); //得到和锁绑定的Condition对象,控制生产线程的唤醒和等待
private Condition pro = lock.newCondition();
//得到和锁绑定的Condition对象,控制消费线程的唤醒和等待
private Condition con = lock.newCondition(); //生产产品的功能
public void produce(String name)
{
lock.lock(); //获取锁
try
{
while (flag)
{
try{pro.await();}catch (InterruptedException e){e.printStackTrace();}
}
this.name = name+"..."+count;
System.out.println(Thread.currentThread().getName()+"***生产了***"+this.name);
count++;
flag = true;
con.signal();
}
finally //为了保证锁必须被释放掉,使用try{...}finally{...}
{
lock.unlock(); //释放锁
}
} //消费产品的功能
public void consume()
{
lock.lock();
try
{
while (!flag)
{
try{con.await();}catch (InterruptedException e){e.printStackTrace();}
}
System.out.println(Thread.currentThread().getName()+"---消费了---"+this.name);
flag = false;
pro.signal();
}
finally
{
lock.unlock();
}
}
} //生产任务
class Producer implements Runnable
{
private Product pro;
public Producer(Product pro)
{
this.pro = pro;
}
public void run()
{
while(true)
{
pro.produce("笔记本电脑");
}
}
} //消费任务
class Consumer implements Runnable
{
private Product pro;
public Consumer(Product pro)
{
this.pro = pro;
}
public void run()
{
while(true)
{
pro.consume();
}
}
} class Demo
{
public static void main(String[] args)
{
Product pro = new Product(); Producer producer = new Producer(pro);
Consumer consumer = new Consumer(pro); new Thread(producer,"生产线01").start();
new Thread(consumer,"消费者01").start();
new Thread(producer,"生产线02").start();
new Thread(consumer,"消费者02").start();
}
}

jdk1.5多线程Lock接口及Condition接口的更多相关文章

  1. java中的锁之Lock接口与Condition接口

    一.Lock源码. 1.是一个接口.一共有6个方法. 2.方法详细如下: (1)当前线程尝试获取锁.结果分两种情况,一是成功获取到锁,则返回:二是获取锁失败,则一直等待.不响应中断请求. (2)当前线 ...

  2. Lock接口之Condition接口

    之前在写显示锁的是后,在显示锁的接口中,提到了new Condition这个方法,这个方法会返回一个Condition对象 简单介绍一下 Condition接口: 任意一个Java对象,都拥有一组监视 ...

  3. java多线程Lock接口简介使用与synchronized对比 多线程下篇(三)

    前面的介绍中,对于显式锁的概念进行了简单介绍 显式锁的概念,是基于JDK层面的实现,是接口,通过这个接口可以实现同步访问 而不同于synchronized关键字,他是Java的内置特性,是基于JVM的 ...

  4. Java之多线程开发时多条件Condition接口的使用

    转:http://blog.csdn.net/a352193394/article/details/39454157 我们在多线程开发中,可能会出现这种情况.就是一个线程需要另外一个线程满足某某条件才 ...

  5. 并发之lock的condition接口

    13.死磕Java并发-----J.U.C之Condition 12.Condition使用总结 11.Java并发编程系列之十七:Condition接口 === 13.死磕Java并发-----J. ...

  6. 多线程-线程间通信-多生产者多消费者问题(JDK1.5后Lock,Condition解决办法及开发中代码范例)

    1 package multithread4; 2 3 import java.util.concurrent.locks.Condition; 4 import java.util.concurre ...

  7. Java的LockSupport工具,Condition接口和ConditionObject

    在之前我们文章(关于多线程编程基础和同步器),我们就接触到了LockSupport工具和Condition接口,之前使用LockSupport工具来唤醒阻塞的线程,使用Condition接口来实现线程 ...

  8. 通过Lock对象以及Condition对象实现多线程同步

    通过Lock对象以及Condition对象实现多线程同步: 在之前的学习中,无论是通过synchronized建立同步代码块,还是通过synchronized建立同步函数,都是把对象看成一把锁来实现同 ...

  9. 6.类似Object监视器方法的Condition接口

    在<1.有关线程.并发的基本概念>中,我们利用synchronized关键字.Queue队列.以及Object监视器方法实现了生产者消费者,介绍了有关线程的一些基本概念.Object类提供 ...

随机推荐

  1. 听同事讲 Bayesian statistics: Part 2 - Bayesian inference

    听同事讲 Bayesian statistics: Part 2 - Bayesian inference 摘要:每天坐地铁上班是一件很辛苦的事,需要早起不说,如果早上开会又赶上地铁晚点,更是让人火烧 ...

  2. HTML5解决跨域问题

    HTML5解决跨域问题 由于浏览器的同源策略,网络连接的跨域访问是不被允许的,XHR对象不能直接与非同源的网站处理数据交互.而同源指的是什么呢?同源的范畴包括:规则(协议),主机号(域名.ip等),端 ...

  3. the apply of backbone

    http://www.developer.com/print/lang/jscript/creating-a-javascript-driven-online-notebook-with-backbo ...

  4. POJ_3321_APPLE_TREE

    poj上面的一道求子树上苹果的题目,网上看了很多题解,下面我来回忆一下,基本来源于大神的微博,http://blog.csdn.net/zhang20072844,我来做个搬运工.先将树的n条边上节点 ...

  5. HTML Jquery;marquee标签

    在<网页制作Dreamweaver(悬浮动态分层导航)>中,运用到了jQuery的技术,轻松实现了菜单的下拉.显示.隐藏的效果,不必再用样式表一点点地修改,省去了很多麻烦,那么jQuery ...

  6. BroadCastReceiver中耗时操作导致ANR

    現象:廣播接收器中進行耗時的I/O操作導致ANR. 查資料發現每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 该对 ...

  7. perl 监控数据库用到的数据结构

    [root@yun1 test]# cat a1.pl my $h={'192.168.11.187'=>['root','1234567'], '192.168.5.7' =>['roo ...

  8. Oracle 创建用户相关

    表空间 Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以有N张表. 有了数据库,就可以创建表空间. 表空间(tablespace)是数据库的逻辑划分,每个 ...

  9. lsof 拥有更多的功能

    lsof 拥有更多的功能# lsof -i 看系统中有哪些开放的端口,哪些进程.用户在使用它们,比 netstat -lptu 的输出详细. # lsof -i 4  查看IPv4类型的进程COMMA ...

  10. SharePoint 2010 母版页制作的简单介绍

    转:http://www.cnblogs.com/jianyus/archive/2012/01/11/2319621.html 1.  首先打开SharePoint Designer 2010,找到 ...