1.wait和notify,notifyAll

  • wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法,定义在Object基类中。
  • wait()方法:对此对象调用wait方法导致本线程放弃对象锁,让线程处于冻结状态,进入等待线程的线程池当中。wait是指已经进入同步锁的线程,让自己暂时让出同步锁,以便使其他正在等待此锁的线程可以进入同步锁并运行,只有其它线程调用notify方法或者notifyAll方法后,才能唤醒线程池中等待的线程。
  • notify()方法:唤醒线程池中的任意一个线程。
  • notifyAll方法:唤醒线程池中的所有线程。

2.线程间通信:多个线程操作同一个资源,但是操作的动作不同,任务不同。

3.等待唤醒机制:操作共享数据的不同动作,一个存入,一个取出;当输入一个的时候,另一个要取出。先让输入线程等待,等输出线程取出后,再唤醒输入线程。

下面看一个例子:需求是要求两个线程操作Resource资源类中的成员变量name,sex,要求一个线程往共享资源类中存入一个姓名和一个姓别,即存入一个资源对象,另一个线程就取出资源类中的对象。即存入一个,就要取出,资源类中对象为空的时候,就再存入一个。这个例子可以用等待唤醒机制解决。

思路:这里在线程代码里面设计一个姓名为peter,性别为man;另一个姓名为“李明”,性别为“男”。通过模2进行切换。输入线程选择操作这连个对象。

java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解

 

看API文档介绍几个方法:

 JDK1.5中提供了多线程的升级解决方案:

特点: 1.将同步synchronized显示的替换成Lock
                    2.接口Condition:Condition替代了Object监视器方法(wait、notify、notifyAll),分别替换成了await(),signal() (唤醒一个等待线                   程),signalAll() 唤醒多个线程。一个锁可以绑定多个condition对象,可以对应好几组wait,notify,notifyAll动作。

java.util.concurrent.locks接口
 *     Lock接口下面的方法
 *     void lock():获取锁,如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。
 *     boolean tryLock():如果获得了锁,返回true。如果别的线程正在持有锁,返回false
 *     boolean tryLock(long time,//等待多长时间获得锁
                TimeUnit unit)
                throws InterruptedException:
       如果获取到锁,立即返回true,如果别的线程正在持有锁,会等待参数给定的时间,如果在这段时间内获得了锁就返回true,如果等待超时,返  回false。

locks的实现类:
      java.lang.Object
             -->java.util.concurrent.locks.ReentrantLock类一个可重入的互斥锁 Lock,替代synchronized,比synchronized有更强大的功能
             -->Java.util.concurrent.locks.ReadWriteLock 提供了一对可供读写并发的锁。

 使用新的锁完成生产者消费者模型:

代码如下:

仓库类(资源)

class ResourceNew{
private String name;
private boolean flag = false;
private int count=1; private final Lock lock = new ReentrantLock();//将同步synchronized显示的替换成Lock
private Condition condition_cusumer = lock.newCondition();//同一个锁上可以绑定多个相关的Condition
private Condition conditon_producer = lock.newCondition(); public void set(String name) throws InterruptedException{
try{
lock.lock();//显示的
while(flag){
conditon_producer.await();//生产者等待t1,t2
}
this.name = name+"---"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
this.flag = true;
//condition.signalAll();//唤醒本方和唤醒对方
condition_cusumer.signal();//唤醒某个消费者
}finally{
lock.unlock();//每个线程进入锁必须要执行的操作,最终要释放锁
}
} public void out() throws InterruptedException{
try{
lock.lock();
while(!flag){
condition_cusumer.await();//消费者等待
}
System.out.println(Thread.currentThread().getName()+".消费者."+this.name);
this.flag = false;
conditon_producer.signalAll();//唤醒生产者
}finally{
lock.unlock();
}
} }

生产者:

/**
*
* @author Administrator
* 生产者负责生产,操作同一个资源,但是是生产动作
*
*/
class producerNew implements Runnable{
private ResourceNew res;
public producerNew(ResourceNew res){
this.res = res;
}
public void run() {
while(true){
try {
res.set("..商品..");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
*
* @author Administrator
* 消费者负责消费生产者提供的产品,操作的同一个资源,但是是消费动作
*
*/
class CusumerNew implements Runnable{
private ResourceNew res;
public CusumerNew(ResourceNew res){
this.res = res;
}
public void run() {
while(true){
try {
res.out();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

消费者:

/**
*
* @author Administrator
* 消费者负责消费生产者提供的产品,操作的同一个资源,但是是消费动作
*
*/
class CusumerNew implements Runnable{
private ResourceNew res;
public CusumerNew(ResourceNew res){
this.res = res;
}
public void run() {
while(true){
try {
res.out();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

 synchronized和java.util.concurrent.locks.Lock的异同 :
 * 相同点:Lock能完成synchronized所实现的所有功能。
 * 不同点:1.Lock比Synchonized更精确的线程锁语义和更好的性能。(Synchonized是独占锁,性能不高,而Lock是借助于JNI,性能更高)
 *            2.Lock必须手动释放锁,在finally里面调用unlock()方法释放锁,而synchronized会自动释放锁。

java基础知识回顾之java Thread类学习(三)--java多线程通信等待唤醒机制(wait和notify,notifyAll)的更多相关文章

  1. java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

     *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...

  2. java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

    1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以 ...

  3. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  4. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  5. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  6. java 22 - 17 多线程之等待唤醒机制(接16)

    先来一张图,看看什么叫做等待唤醒机制 接上一章的例子. 例子:学生信息的录入和获取 * 资源类:Student  * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread( ...

  7. Java基础知识回顾(一):字符串小结

    Java的基础知识回顾之字符串 一.引言 很多人喜欢在前面加入赘述,事实上去技术网站找相关的内容的一般都应当已经对相应知识有一定了解,因此我不再过多赘述字符串到底是什么东西,在官网中已经写得很明确了, ...

  8. Java 之多线程通信(等待/唤醒)

    多线程间通信: 多个线程在处理同一个资源, 但是任务却不同. 等待/唤醒机制 涉及的方法 wait(): 让线程处于冻结状态, 被 wait() 的线程会被存储到线程池中 notify(): 唤醒线程 ...

  9. Java第二十五天,多线程之等待唤醒机制

    当线程被创建并且被启动之后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,而是具有以下多种状态: 这六种状态之间的转换关系如下: 1.等待唤醒机制 注意: (1)两个线程之间必须用同步代码块 ...

  10. java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:

    总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但 ...

随机推荐

  1. Flink Catalog

    概念 Catalog 提供了元数据信息,例如数据库.表.分区.视图以及数据库或其他外部系统中存储的函数和信息. 数据处理最关键的方面之一是管理元数据. 元数据可以是临时的,例如临时表.或者通过 Tab ...

  2. 基于sqli-labs Less-1的sql联合注入详解

    SQLi Labs 是一个专为学习和测试 SQL 注入漏洞设计的实验平台,旨在帮助安全研究人员.开发者和网络安全爱好者深入理解并实践各种 SQL 注入攻击.该平台提供了一系列精心设计的实验环境,模拟真 ...

  3. 【Playwright + Python】系列(十)利用 Playwright 完美处理 Dialogs 对话框

    哈喽,大家好,我是六哥!今天我来给大家分享一下如何使用playwight处理Dialogs对话框,面向对象为功能测试及零基础小白,这里我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先**收 ...

  4. 2024-2025, 四大翻译工具加AI翻译的深度对比

    前言 在过去两年中,人工智能技术的迅猛发展对翻译工具产生了深远的影响. 本期特意挑选了四款翻译工具以及一个AI翻译工具, 对其性能进行评测,看看在AI技术的加持下,它们的质量提升如何. 以下是参赛选手 ...

  5. 拯救php性能的神器webman-数据库

    有了webman的这个框架,我们得看看它是怎么使用数据库的,毕竟我们不能一直用内存变量啊. 好,很简单一句话跑起来. composer require -W illuminate/database i ...

  6. Pcb-Merging:无需训练的多任务模型合并方案 | NeurIPS'24

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: Parameter Competition Balancing for Model Merging 论文地址:https://arxiv.or ...

  7. context之WithTimeout的使用

    1. context包的WithTimeout()函数接受一个 Context 和超时时间作为参数,返回其子Context和取消函数cancel2. 新创建协程中传入子Context做参数,且需监控子 ...

  8. 基于antlr的表达式解析器

    package formula; import java.util.HashMap; import java.util.List; import java.util.Map; import org.a ...

  9. python模块之sqlite3

    在Python中操作sqlite3 1)基本使用 import sqlite3 conn = sqlite3.connect('example.db') cursor = conn.cursor() ...

  10. 开源 - Ideal库 - Excel帮助类,设计思路(一)

    今天开始和大家分享关于Excel最长常用操作封装. 01.起因 市面上有很多Excel操作库,这些库设计之初的目标是提供对Excel的各种操作功能,包括数据.样式.公式.图表等等.而对于我们平时开发来 ...