锁/消费者问题/多线程

Java多线程高级控制:条件对象和锁对象的实战演示 在Java中,Object类的waitnotify和notifyAll方法是用于线程间通信的基础机制。它们允许一个线程在等待某个条件成立时放弃CPU的控制权,而其他线程在条件成立时通过notify或notifyAll方法来唤醒这些等待的线程。然而,这种方式存在一些局限性,如无法区分不同条件的等待与通知,以及在唤醒等待线程时没有优先级区分等。Condition接口在包中提供了一种更加灵活的机制,它允许线程在满足一个或多个条件的前提下进入等待状态。与Object。 阅读详情

引言:

1.Synchronized:配合wait()、notifyAll();

2.Lock:配合await()、signalAll();

(1)用Synchronized来实现多个线程(四个)对共享资源ticket进行加、减操作;

始终在0 , 1数值两个之间进行切换。

package com.tencent.JUC;

public class Lock {
    public static void main(String[] args) throws Exception {
        Ticket t = new Ticket();
        //四个线程
        new Thread( ()->{
            for(int i=0;i<10;i++) {
                try {
                    t.incre();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } , "A").start();

        new Thread( ()->{
            for(int i=0;i<10;i++) {
                    try {
                        t.decre();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
        } , "B").start();

        new Thread( ()->{
            for(int i=0;i<10;i++) {
                try {
                    t.incre();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } , "C").start();

        new Thread( ()->{
            for(int i=0;i<10;i++) {
                try {
                    t.decre();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } , "D").start();
    }
}

class Ticket {
    private static int number = 0;

    public synchronized void incre() throws InterruptedException {
        while(number != 0) {   //循环:解决虚拟唤醒的问题
            this.wait();
        }
        System.out.println(Thread.currentThread().getName() + "线程:" + number + "准备+1");
        number++;
        this.notifyAll();  //唤醒除自己之外的其它几个等待线程
    }

    public synchronized void decre() throws InterruptedException {
        while(number == 0) {
            this.wait();
        }
        System.out.println(Thread.currentThread().getName() + "线程:"  + number + "准备-1");
        number--;
        this.notifyAll();
    }
}

(2)同上,改为用Lock锁来实现生产者、消费者问题:

package com.tencent.JUC;


import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockTest {
    public static void main(String[] args) throws Exception {
        Ticket2 t = new Ticket2();
        //四个线程
        new Thread( ()->{
            for(int i=0;i<10;i++) {
                try {
                    t.incre();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } , "A").start();

        new Thread( ()->{
            for(int i=0;i<10;i++) {
                    try {
                        t.decre();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
        } , "B").start();

        new Thread( ()->{
            for(int i=0;i<10;i++) {
                try {
                    t.incre();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } , "C").start();

        new Thread( ()->{
            for(int i=0;i<10;i++) {
                try {
                    t.decre();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } , "D").start();
    }
}

class Ticket {
        private static int number = 0;

    public synchronized void incre() throws InterruptedException {
        while(number != 0) {   //循环:解决虚拟唤醒的问题
            this.wait();
        }
        System.out.println(Thread.currentThread().getName() + "线程:" + number + "准备+1");
        number++;
        this.notifyAll();  //唤醒除自己之外的其它几个等待线程
    }

    public synchronized void decre() throws InterruptedException {
        while(number == 0) {
            this.wait();
        }
        System.out.println(Thread.currentThread().getName() + "线程:"  + number + "准备-1");
        number--;
        this.notifyAll();
    }
}

class Ticket2 {
    private static int number = 0;

    Lock lock = new ReentrantLock();
    Condition condition = lock.newCondition(); //锁的监视器

    public void incre() throws InterruptedException {
        try {
            lock.lock();
            //业务代码
            while(number != 0) {
                condition.await();
            }
            System.out.println(Thread.currentThread().getName() + "线程:"  + number + "准备+1");
            number++;
            condition.signalAll();
        } catch (Exception e ) {
            System.out.println(e.getMessage());
        } finally {
            lock.unlock();
        }
    }

    public void decre() throws InterruptedException {
        try {
            lock.lock();
            //业务代码
            while(number == 0) {
                condition.await();
            }
            System.out.println(Thread.currentThread().getName() + "线程:"  + number + "准备-1");
            number--;
            condition.signalAll();
        } catch (Exception e ) {
            System.out.println(e.getMessage());
        } finally {
            lock.unlock();
        }
    }
}

(3)测试:

"C:\Program Files\Java\jdk1.8.0_101\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2020.1.2\lib\idea_rt.jar=59384:D:\IntelliJ IDEA 2020.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_101\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\rt.jar;F:\test-0517-tencent\out\production\test-0517-tencent;F:\test-0517-tencent\src\lib\commons-io-1.4.jar" com.tencent.JUC.LockTest
A线程:0准备+1
B线程:1准备-1
C线程:0准备+1
B线程:1准备-1
A线程:0准备+1
B线程:1准备-1
A线程:0准备+1
B线程:1准备-1
A线程:0准备+1
B线程:1准备-1
A线程:0准备+1
B线程:1准备-1
A线程:0准备+1
B线程:1准备-1
A线程:0准备+1
B线程:1准备-1
A线程:0准备+1
B线程:1准备-1
A线程:0准备+1
B线程:1准备-1
A线程:0准备+1
D线程:1准备-1
C线程:0准备+1
D线程:1准备-1
C线程:0准备+1
D线程:1准备-1
C线程:0准备+1
D线程:1准备-1
C线程:0准备+1
D线程:1准备-1
C线程:0准备+1
D线程:1准备-1
C线程:0准备+1
D线程:1准备-1
C线程:0准备+1
D线程:1准备-1
C线程:0准备+1
D线程:1准备-1
C线程:0准备+1
D线程:1准备-1

Process finished with exit code 0

 

基于STM32的工业设备状态监测系统 工业设备的预测性维护需求日益增长,本文设计了一款基于STM32的智能监测终端,可实时采集设备振动、温度、电流等关键参数,通过边缘计算分析设备健康状态,实现故障预警与能效优化。系统支持4G/LoRa远程通信,适用于工厂、发电站等工业场景。本系统实现了工业设备关键参数的实时监测,故障识别准确率达到92%。:STM32F429(带FPU,支持浮点运算)多参数联合判据(振动+温度+电流突变检测)ACS712电流检测模块(0-30A)FFT频谱分析(识别轴承故障特征频率)故障代码生成(支持16种预设故障类型) 阅读详情

相关推荐

保姆级教程:用CellOracle 0.10.13从单细胞数据构建基因调控网络(附完整代码)

本文提供了一份详细的CellOracle 0.10.13使用指南,帮助用户从单细胞数据构建基因调控网络。通过Python接口,即使是生物信息学新手也能快速掌握数据准备、KNN插补、GRN计算及可视化等关键步骤。文章包含完整代码和实用技巧,助力单细胞转录组数据分析。

weixin_42563415的博客 723

多线程的三种实现方法、线程类的常见方法、线程安全问题:synchronized和Lock锁、生产者和消费者问题

多线程的三种实现方法、线程类的常见方法、线程安全问题:synchronized和Lock锁、生产者和消费者问题

罪域之骨终成王 296

从零开始,用Cadence Virtuoso手把手仿真一个1.5V LDO(附完整电路与仿真脚本)

本文详细介绍了如何使用Cadence Virtuoso从零开始仿真一个1.5V LDO,包括环境准备、电路导入、Testbench构建、核心仿真类型分析以及高级调试技巧。通过完整的电路与仿真脚本,帮助读者掌握LDO设计与仿真的关键技术,提升电路设计能力。

weixin_31309419的博客 445

【JavaLearn】(16)多线程提升训练:生产者和消费者问题、Lock锁、ReadWriteLock、BlockingQueue、volatile、线程池、线程同步练习

目录1. 生产者消费者扩展1.1 多个生产者、多个消费者1.2 使用匿名内部类1.3 使用 Lock 锁2. 认识 Lock 锁API2.1 Lock2.2 ReadWriteLock3. BlockingQueue4. volatile5. 多线程练习题5.1 打印数字及字母5.2 打印递增的数字5.3 模拟售票5.4 自定义容器 1. 生产者消费者扩展 1.1 多个生产者、多个消费者 由一个生产者、一个消费者、一个商品 ==》 扩展为多个生产者、多个消费者、多个商品 最多有 10 个商品,最少有 0 个

weixin_44022996的博客 573

MCP4728 电路及stm32F103程序移植

写在前面 通过优快云查到一些MCP4728 的程序,结合程序及datasheet对于驱动的描述,理清了思路 感谢开路者! MCP4728的电路比较简单,见下文描述 应用电路 datasheet: 实际测试电路: SCL接stm32的PB10,SDA接PB11 RDY/BSY引脚和LDCA引脚,悬空 解释见截图: MCP4728地址 选择任意输出通道写入DAC输入寄存器 应用程序 int mcp4728_write_all_channel(float vol1, float vol2, fl

u013074298的专栏 5425

ZYNQ开发(2)在Linux系统层上PL-PS通过AXI-DMA传输数据详细步骤及注意事项

参考的网络资料 https://github.com/bperez77/xilinx_axidma/tree/master https://gitlab.gnome.org/HosseinBeheshti/UlteraZed7EV/-/tree/master/petalinux/xilinx_axidma https://www.icode9.com/content-3-925319.html https://blog.youkuaiyun.com/weixin_38218267/article/details/1

aizaiyueye的专栏 3448

使用Lock锁机制实现 多线程的 多生产 多消费 模式。

今天学习了·,多线程的生产者和消费者模式,自己就写了一个多生产 多消费的例子,我感觉这个例子可以优化,想法就是  对 run 方法进行了同步 就可以不用对Product类进行lock和unlock了,但是尝试了很久都没成功,如有大神帮忙看看代码,小弟感激不尽。package cn.sdut.threaddemo; import java.util.concurrent.locks.Conditi

zxc_helloworld的博客 358

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

多线程之生产者消费者问题解析

在多线程系统中,不同的线程执行不同的任务;如果这些任务之间存在联系,那么执行这些任务的线程之间就必须能够通信,共同协调完成系统任务。这就产生了生产者和消费者的问题

阿杰 1152

6、基于深度强化学习的无人机路径规划

本文介绍了一种结合人工势场法的改进DQN深度强化学习算法在无人机路径规划中的应用。通过设计合理的网络结构、状态空间、动作空间和融合引力-斥力机制的奖励函数,实现了无人机在复杂环境中的自主避障与目标导向飞行。采用轻量级神经网络提升实时性,并在Gazebo仿真环境中进行训练与测试,结果表明该算法具有快速收敛、高成功率和良好适应性。实验评估指标包括损失函数、最大Q值和任务成功率,验证了方法的有效性。文章还探讨了其在物流配送、农业植保和环境监测等领域的应用前景,并展望了多无人机协同与复杂环境适应性等未来研究方向。

html8的博客 239

6、 实时家禽健康识别与疾病检测系统的深入解析

本文深入解析了一种基于物联网的实时家禽健康识别与疾病检测系统,结合图像分析和音频分析技术,能够有效识别病鸡并防止疾病传播。文章详细介绍了系统的测试环境、数据采集与预处理方法、图像与音频分析流程,并对系统性能进行了全面评估。最后提出了未来改进方向,包括多模态融合、深度学习应用及实时性优化等。

weixin_28840811的博客 186

多线程生产消费问题,信号灯法,管程法,线程的锁以及唤醒机制

多线程三大不安全案例以及预防方法,线程的锁,休眠,唤醒机制.线程停止;线程朽休眠;线程礼让;强制执行;线程的同步机制, 多线程的生产消费问题,管程法;信号灯法,

dis_1illusion的博客 402

Dify智能体开发:发布嵌入网站

Dify 支持将你的 AI 应用嵌入到业务网站中,你可以使用该能力在几分钟内制作具有业务数据的官网 AI 客服、业务知识问答等应用。点击 WebApp 卡片上的嵌入按钮,复制嵌入代码,粘贴到你网站的目标位置。

王国平的博客 3244

24、java 多线程之三:线程的死锁(详细案例)、Lock锁解决线程安全(方式三)、线程通信(生产者/消费者问题)、实现 Callable 接口创建线程(方式三)、使用线程池创建线程(方式四)

2都被释放后),再执行第一个线程的结果;都被释放后),再执行第二个线程的结果;的情况,因此在线程同步的情况下可能。)正在被主线程使用并未被释放,因此。,否则该程序将会一直执行下去;,这是该程序最常遇到的情况,// 项目输出信息如下,并。的同步监视器(即:锁)是。的同步监视器(即:锁)是。的同步监视器(即:锁)是。的同步监视器(即:锁)是。// 该线程是生成前。

狮子座的男孩 1877

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

头歌实训作业:生产者消费者问题实践

第1关:生产者消费者问题实践

B5201234的博客 1664

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【JUC 一】线程 进程 synchronized Lock锁 生产者 消费者 8锁 线程安全集合类

给大家送一个小福利附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!法 | 没有锁 | 不需要等待 || 静态方法 | 没有锁 | 不需要等待 |自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

2401_83916241的博客 930

面试高频— —多线程、锁

面试高频,多线程与高并发,底层必知必会

weixin_45565886的博客 264

Java多线程学习之wait、notify/notifyAll 详解

1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。 2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。 3、 由于 wait()、notify/notifyAll() 在syn...

一只苟延残喘的卑微蝼蚁 371

再探Java多线程Ⅱ --- (创建方式+等待唤醒+Lock锁)

一秒搞懂!!! 多线程的秘密全在这!

fake_ss198的博客 1070

多线程知识点整理

1.线程创建,2.线程运行,3线程阻塞,4.线程等待,5.timed_waiting 6.线程执行完毕。

Chen_leilei的博客 292

操作系统④-⑤:多线程同步、互斥、同步、如何实现:锁和信号量(PV操作)

多线程同步 线程之间有共享进程的资源,⽐如代码段、堆空间、数据段、打开的⽂件等资源,但每个线程都有⾃⼰独⽴的栈空间。 1 互斥 互斥(mutualexclusion):保证⼀个线程在临界区执⾏时,其他线程应该被阻⽌进⼊临界区。 解决了并发进程/线程对临界区的使⽤问题。 多进程竞争公共资源的时候,也可以使⽤互斥的⽅式来避免资源竞争造成的资源混乱。 2 同步 所谓同步,就是并发进程/线程在⼀些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通信息称为进程/线程同步。 3 互斥与同步的实现和使用——

weixin_44478659的博客 1330

一文速通Python并行计算:01 Python多线程编程-基本概念、切换流程、GIL锁机制和生产者与消费者模型

但如果当前有多个线程处于就绪状态(等待 CPU 调度)时,处于运行状态的线程将无法一直霸占 CPU 资源,为了使其它线程也有执行的机会,CPU 会在一定时间内强制当前运行的线程让出 CPU 资源,以供其他线程使用。线程的新建状态:无论是通过 Thread 类直接实例化对象创建线程,还是通过继承自 Thread 类的子类实例化创建线程,新创建的线程在调用 start() 方法之前,不会得到执行,此阶段的线程就处于新建状态。程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程。

weixin_55010563的博客 445

Java多线程学习-----wait()、notify/notifyAll()的使用

多线程的几种状态 新建          就绪         运行          阻塞     &n...

qq_39077696的博客 334

Java线程与锁优化

这次来学习下Java中线程的相关知识,也是之后学习Java并发机制的基础。前面在学习Handler机制以及JVM之内存管理与分配机制时均简要介绍过线程,那么首先来复习下从这两篇文章中我们了解到的线程的相关知识,有利于我们之后的学习。 在Handler机制学习中,我们介绍了进程和线程之间的区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位;进程都有独立的代码和数据空间,线程组之间只能共享资源,每个线程都有自己独立的运行栈和程序计数器(PC)。还介绍了多线程的概念,通过将CPU的时间片按照

iris的博客 327

JUC-Lock锁

4- Lock锁 4.1 传统方式(同步方法) 传统的 synchronized package cn.guardwhy.test01; // 1.并发:多线程操作同一个资源类,把线程拿进线程中 public class SaleTicketDemo01 { public static void main(String[] args) { Ticket ticket = new Ticket(); // 函数式接口 new Thread(()-&gt

hxy1625309592的博客 240
上一篇: leetcode - 链表两数相加
下一篇: SQL-leetcode 181
ଳxin
博客等级 码龄8年 83粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值