传统生产者和消费者问题,Sychronized版和Lock版

1.生产者和消费者问题Synchronized版

面试:单例模式、排序算法、生产者消费者、死锁

package com.kuang.pc;/*** 线程之间的通信问题,生产者和消费者问题! 等待唤醒 ,通知唤醒* 线程交替执行 A B 操作同一个变量 num=0* A num+1;* B num-1;*/
public class A {public static void main(String[] args) {Data data = new Data();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},"A").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},"B").start();}}
// 判断等待,业务,通知
class Data{//数字  资源类private  int num = 0;//+1public synchronized void increment() throws InterruptedException {if(num!=0){//等待this.wait();}num++;//通知其他线程,我+1完毕了System.out.println(Thread.currentThread().getName()+"=>"+num);this.notifyAll();}//+1public synchronized void decrement() throws InterruptedException {if(num==0){//等待this.wait();}num--;//通知其他线程,我-1完毕了System.out.println(Thread.currentThread().getName()+"=>"+num);this.notifyAll();}}

问题A B C D 开四个线程跑,在if判断之后被唤醒,没判断条件被执行了两次增加,导致的虚假唤醒问题。 

package com.kuang.pc;/*** 线程之间的通信问题,生产者和消费者问题! 等待唤醒 ,通知唤醒* 线程交替执行 A B 操作同一个变量 num=0* A num+1;* B num-1;*/
public class A {public static void main(String[] args) {Data data = new Data();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},"A").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},"B").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},"C").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},"D").start();}}
// 判断等待,业务,通知
class Data{//数字  资源类private  int num = 0;//+1public synchronized void increment() throws InterruptedException {while (num!=0){//等待this.wait();}num++;//通知其他线程,我+1完毕了System.out.println(Thread.currentThread().getName()+"=>"+num);this.notifyAll();}//+1public synchronized void decrement() throws InterruptedException {while (num==0){//等待this.wait();}num--;//通知其他线程,我-1完毕了System.out.println(Thread.currentThread().getName()+"=>"+num);this.notifyAll();}}

 

2.新版Lock锁解决消费者生产者问题。 

 

package com.kuang.pc;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 线程之间的通信问题,生产者和消费者问题! 等待唤醒 ,通知唤醒* 线程交替执行 A B 操作同一个变量 num=0* A num+1;* B num-1;*/
public class B {public static void main(String[] args) {Data1 data = new Data1();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},"A").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},"B").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.increment();} catch (InterruptedException e) {e.printStackTrace();}}},"C").start();new Thread(()->{for (int i = 0; i < 10; i++) {try {data.decrement();} catch (InterruptedException e) {e.printStackTrace();}}},"D").start();}}// 判断等待,业务,通知
class Data1 {//数字  资源类private int num = 0;Lock lock=new ReentrantLock();Condition condition = lock.newCondition();
//        condition.await();等待
//        condition.signalAll();唤醒全部//+1public void increment() throws InterruptedException {lock.lock();try {//业务代码while (num != 0) {//等待condition.await();}num++;System.out.println(Thread.currentThread().getName() + "=>" + num);//通知其他线程,我+1完毕了condition.signalAll();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}//+1public void decrement() throws InterruptedException {lock.lock();try {//业务代码while (num == 0) {//等待condition.await();}num--;System.out.println(Thread.currentThread().getName() + "=>" + num);//通知其他线程,我-1完毕了condition.signalAll();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}

任何一个新的技术,绝对不是仅仅只覆盖了原来的技术,优势,和补充!

Condition 优势精准通知,唤醒线程

package com.kuang.pc;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 线程之间的通信问题,生产者和消费者问题! 等待唤醒 ,通知唤醒* 线程交替执行 A B 操作同一个变量 num=0* A num+1;* B num-1;*/
public class C {public static void main(String[] args) {Data2 data = new Data2();new Thread(()->{for (int i = 0; i < 10; i++) {data.printA();}},"A").start();new Thread(()->{for (int i = 0; i < 10; i++) {data.printB();}},"B").start();new Thread(()->{for (int i = 0; i < 10; i++) {data.printC();}},"C").start();}}
// 判断等待,业务,通知
class Data2 {//数字  资源类private Lock lock=new ReentrantLock();private Condition condition1 = lock.newCondition();private Condition condition2 = lock.newCondition();private Condition condition3 = lock.newCondition();private int num=1;public void printA(){lock.lock();try {if (num!=1){//等待condition1.await();}num=2;System.out.println(Thread.currentThread().getName()+":Aaa");//唤醒,唤醒指定的人,Bcondition2.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void printB(){lock.lock();try {if (num!=2){condition2.await();}num=3;System.out.println(Thread.currentThread().getName()+":Bbb");condition3.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void printC(){lock.lock();try {if (num!=3){condition3.await();}System.out.println(Thread.currentThread().getName()+":Ccc");num=1;condition1.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}

精准唤醒线程  Condition

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/133991.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】入门及生命周期(前后端分离)

目录 一、Vue简介 1、Vue.js是什么 2、库和框架的区别 2.1 库(Library) 2.2 框架(Framework) 3、MVVM的介绍 二、Vue入门 1、Vue快速入门 2、Vue的优势 三、Vue事件 四、Vue生命周期 1、实例 一、Vue简介 1、Vue.js是什么 Vue是一款流行的构建用户界面(UI)的[渐进式…

基于 Alpine 环境构建 aspnetcore6-runtime 的 Docker 镜像

关于 Alpine Linux 此处就不再过多讲述&#xff0c;请自行查看相关文档。 .NET 支持的体系结构 下表列出了当前支持的 .NET 体系结构以及支持它们的 Alpine 版本。 这些版本在 .NET 到达支持终止日期或 Alpine 的体系结构受支持之前仍受支持。请注意&#xff0c;Microsoft 仅正…

postman导入json脚本文件(Collection v1.0、Collection v2.0)

1. 以postman v8.5.1 版本为例 2. 在postman v5.0.2 低版本中导出json脚本文件, 请选择Collection v2.0 Export - Collection v2 3. 在postman v8.5.1 版本 导入 json脚本文件 Import - Collection v2 - Export - Import

InfiniBand vs 光纤通道,存储协议的选择

数字时代&#xff0c;数据量爆发增长&#xff0c;企业越来越迫切地追求高吞吐量、低延迟和更高性能的网络基础设施&#xff0c;存储协议的选择变得愈发至关重要。在众多存储协议中&#xff0c;InfiniBand和光纤通道备受关注。本文旨在深入探讨InfiniBand和光纤通道作为存储协议…

mysql 日志总结

mysql 根据日志的功能&#xff0c;分6种 慢查询日志&#xff1a;记录所有执行时间超过 long_query_time 的所有查询&#xff0c;方便我们对查询进行优化通用查询日志&#xff1a;记录所有连接的起始时间和终止时间&#xff0c;以及连接发送给数据库服务器的所有指令&#xff0…

【Spring面试】二、BeanFactory与IoC容器的加载

文章目录 Q1、BeanFactory的作用是什么&#xff1f;Q2、BeanDefinition的作用是什么&#xff1f;Q3、BeanFactory和ApplicationContext有什么区别&#xff1f;Q4、BeanFactory和FactoryBean有什么区别&#xff1f;Q5、说下Spring IoC容器的加载过程&#xff08;※&#xff09;Q…

【Bun1.0】使用 Bun.js 构建快速、可靠和安全的 JavaScript 应用程序

bun.js Bun 是一个现代的JavaScript运行环境&#xff0c;如Node, Deno。主要特性如下: 启动速度快。更高的性能。完整的工具&#xff08;打包器、转码器、包管理&#xff09;。 官网 https://bun.sh 优点 与传统的 Node.js 不同&#xff0c;Bun.js 提供了一些新的特性和功…

esp32编译问题

-Werroruninitialized 显然变量是初始化了&#xff0c;只是这s13觉等没初始化还居然报错了。 解决方法&#xff1a;add_compile_options(-Wno-uninitialized) 【cmake篇】选择编译器及设置编译参数_cmake选择编译器_仲夏夜之梦~的博客-CSDN博客https://blog.csdn.net/challen…

JavaScript-promise使用+状态

Promise 什么是PromisePromise对象就是异步操作的最终完成和失败的结果&#xff1b; Promise的基本使用&#xff1a; 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compati…

脚本:用python实现五子棋

文章目录 1. 语言2. 效果3. 脚本4. 解读5. FutureReference 1. 语言 Python 无环境配置、无库安装。 2. 效果 以第一回合为例 玩家X 玩家0 3. 脚本 class GomokuGame:def __init__(self, board_size15):self.board_size board_sizeself.board [[ for _ in range(board_…

数字IC设计之时序分析基础概念汇总

1 时钟Clock 理想的时钟模型是一个占空比为50%且周期固定的方波。时钟是FPGA中同步电路逻辑运行的一个基准。理想的时钟信号如下图: 2 时钟抖动Clock Jitter 理想的时钟信号是完美的方波&#xff0c;但是实际的方波是存在一些时钟抖动的。那么什么是时钟抖动呢?时钟抖动&#…

sql注入Less-2

后台sql s q l " S E L E C T ∗ F R O M u s e r s W H E R E i d sql "SELECT * FROM users WHERE id sql"SELECT∗FROMusersWHEREidid LIMIT 0,1"; 注入语句 http://192.168.200.26/Less-3/?id-1? union select 1,2,database();– 使用id-1 便可…

如何在JavaScript中实现字符串模板替换?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用模板字符串&#xff08;Template Strings&#xff09;⭐ 使用正则表达式替换⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门…

Keepalived+LVS高可用集群

目录 一、keepalived介绍&#xff1a; 二、keepalived工具介绍&#xff1a; &#xff08;1&#xff09;管理 LVS 负载均衡软件&#xff1a; &#xff08;2&#xff09;支持故障自动切换&#xff1a; &#xff08;3&#xff09;实现 LVS 负载调度器、节点服务器的高可用性&…

【计算机网络】Tcp详解

文章目录 前言Tcp协议段格式TCP的可靠性面向字节流应答机制超时重传流量控制滑动窗口&#xff08;重要&#xff09;拥塞控制延迟应答捎带应答标志位具体标志位三次握手四次挥手粘包问题TCP异常情况listen的第二个参数 前言 前面我们学习了传输层协议Udp&#xff0c;今天我们一…

CPU的三级缓存

CPU缓存&#xff08;Cache Memory&#xff09;是位于CPU与内存之间的临时存储器&#xff0c;它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾&#xff0c;因为CPU运算速度要比内存读写速度快很多&#…

高电压+大电流 IGBT静态参数测试解决方案

近年来IGBT成为电力电子领域中尤为瞩目的电力电子器件,并得到越来越广泛的应用,那么IGBT的测试就变的尤为重要了。lGBT的测试包括静态参数测试、动态参数测试、功率循环、HTRB可靠性测试等,这些测试中最基本的测试就是静态参数测试。 IGBT静态参数主要包含:栅极-发射极阈值电压…

“深入理解SpringMVC的JSON数据返回和异常处理机制“

目录 引言1. SpringMVC之JSON数据返回1.1 导入依赖1.2 配置弹簧-MVC.xml1.3 ResponseBody注解使用1.4.Jackson 2. 异常处理机制2.1 为什么要全局异常处理2.2 异常处理思路2.3 SpringMVC异常分类2.4 综合案例 总结 引言 在现代Web开发中&#xff0c;SpringMVC是一个广泛使用的框…

Linux权限的理解

目录 权限的概念权限管理默认权限访问权限的相关指令粘滞位 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为核心 但我们不能直接接触核心&#xff0c;我们不擅长和内核交流&#xff0c;它也没法信任你&#xff0c;所以需要通过外壳程序 shell &#xff0c;shell外壳…

应用在儿童平板防蓝光中的LED防蓝光灯珠

现在电子产品多&#xff0c;手机、平板电脑、电子书等等&#xff0c;由于蓝光有害眼睛健康&#xff0c;于是市场上有很多防蓝光的眼镜、防蓝光的手机膜、防蓝光的平板&#xff0c;这些材料和设备到底有没有用&#xff1f;如何正确预防蓝光危害呢&#xff1f; 我们现在所用的灯…