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. 一周一话题之一(EF-CodeFirst、MEF、T4框架搭建学习)

    本话题是根据郭明峰博客<MVC实用架构系列>的搭建学习总结. -->目录导航 一.数据仓储访问的构建     1.UnitOfWork的构建     2.Repository的构建 ...

  2. 运行 Docker 容器时的安全风险:别丢了你的套接字

    我们都遇到过这种情况:你只是想尝试一段命令行,但安装进程却如同抵押贷款申请那般繁琐.如果不是强制要求完成这么多步骤,你的开发环境会被永远不会再使用的库弄乱.自然, Docker 来了以后,你惊异地发现 ...

  3. Javascript 取小数点后面N位

    用Javascript取float型小数点后两位,例22.127456取成22.13,如何做? 1. 最笨的办法....... [我就怎么干的.........] 1function get() 2{ ...

  4. AD认证

    这两天接触到一个新的知识点,AD验证.什么是AD验证?Active Directory——活动目录,活动目录只是LDAP的一个实现,提供LDAP认证.Radius认证和NTML认证,都是标准认证方式 ...

  5. USACO3.35A Game(记忆化)

    刚开始理解有点误,想成每步都是最优的 ,结果卡在第六组数据上,, 无奈瞧了下别人的 发现自己理解错了,,我看的还是中文翻译.. 简单的记忆化 /* ID: shangca2 LANG: C++ TAS ...

  6. 使用表达式避免拼接SQL语句

    在SQL语句编写过程中,无论在存储过程中还是在程序中,有时为了使语句兼容全部情况与某字段的特殊情况,不得不拼接SQL字串 如下表 商品ID 类别ID 1 1 2 1 3 2 4 3 5 3 如果我们要 ...

  7. 读完了简明Python教程(a bite of Python)

    因为学过C/C++,简明教程里很多共通的地方一看就明白. 明天做书最后的练习. <--! 代码占位 -->

  8. eclipse环境NDK问题汇总

    1. 配置NDK路径设置 可以在cygwin中通过vim修改,也可以在windows安装目录中修改 home\<你的用户名>\.bash_profile 文件中最后添加环境变量 NDK=/ ...

  9. Centos6.4 设置开机自动以某个非root用户启动脚本

    开机自动运行脚本,可以将脚本的执行命令放在 /etc/rc.d/rc.local 文件中,但是这样开机自动运行这个脚本的用户默认为root. 如果想以某个非root用户运行脚本,可以使用如下命令: s ...

  10. GeoServer基础教程(一):环境搭建篇

    转自:http://imxz.me/tech/3sdev/installation-of-geoserver.html GeoServer的是一个基于Java的软件,它允许用户查看和编辑地理空间数据, ...