JUC练习代码-Synchronized实现生产者消费者问题

生产者消费者模式 生产者消费者synchronized实现方式 立即下载

生产者消费者问题,用Synchronized关键字解决方法如下:
两个线程操作同一个对象,一个进行+1操作,一个进行-1操作。
本代码仅用于练习操作,不要直接在生产环境执行。

public class JUCTest01 {
    public static void main(String[] args) throws InterruptedException {
        Data data = new Data();
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "A").start();
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    data.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "B").start();

    }
}

//判断是否等待,业务,干完活通知
class Data {
    private int number = 0;

    public synchronized void increment() throws InterruptedException {
        if (number != 0) {
            //等待
            this.wait();
        }
        number++;

        //通知其他线程,我+1完毕了
        System.out.println(Thread.currentThread().getName() + "执行了+1" + ";number=" + number);
        this.notifyAll();


    }

    public synchronized void decrement() throws InterruptedException {
        if (number == 0) {
            //等待
            this.wait();
        }
        number--;

        //通知其他线程,我+1完毕了
        System.out.println(Thread.currentThread().getName() + "执行了-1" + ";number=" + number);
        this.notifyAll();

    }
}

代码执行结果:
A执行了+1;number=1
B执行了-1;number=0
A执行了+1;number=1
B执行了-1;number=0
A执行了+1;number=1
B执行了-1;number=0
A执行了+1;number=1
B执行了-1;number=0
A执行了+1;number=1
B执行了-1;number=0

上面样例,仅存在AB两个对变量进行操作,如果我们将代码修改下,增加一CD等线程一起进行操作。
则会打印出number=2,3,负数等其他异常情况。

上述代码中我们用了if去进行判断其实是有问题的。

jdk文档中也注明,因为存在虚假唤醒,wait方法最好放在while循环中。
在这里插入图片描述
我们将上述方法if改为while条件判断下。

public class JUCTest01 {
    public static void main(String[] args) throws InterruptedException {
        Data data = new Data();
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "A").start();
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    data.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "B").start();
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "C").start();
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    data.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "D").start();

    }
}

//判断是否等待,业务,干完活通知
class Data {
    private int number = 0;

    public synchronized void increment() throws InterruptedException {
        while (number != 0) {
            //等待
            this.wait();
        }
        number++;

        //通知其他线程,我+1完毕了
        System.out.println(Thread.currentThread().getName() + "执行了+1" + ";number=" + number);
        this.notifyAll();


    }

    public synchronized void decrement() throws InterruptedException {
        while (number == 0) {
            //等待
            this.wait();
        }
        number--;

        //通知其他线程,我+1完毕了
        System.out.println(Thread.currentThread().getName() + "执行了-1" + ";number=" + number);
        this.notifyAll();

    }
}

再次执行打印结果,则可以正常输出01。

生产者消费者Java—synchronized 机制 自己写的生产者消费者程序,是一个完整的工程项目,导入到eclipse即可运行,在这里提供给需要的人。 立即下载

相关推荐

SageMath下载与安装

SageMath的下载与安装

旺旺的碎冰冰~的博客 7495

使用synchronized实现生产者消费者

生产者消费者程序可使用多种方法实现,有使用synchronized关键字,Lock对象,semaphore同步工具。今天用synchronized实现时碰到两个问题,一个是报 IllegalMonitorStateException ,另一个是碰到死锁。死锁暂时解决不了。 生产者消费者有一个生产者一个消费者及多个生产者多个消费者。 一个生产者一个消费者 package cn.bj...

U___U的专栏 1028

LBM模式学习·保姆级安装及初步使用教程

在学习LBM的过程中,我感觉可供参考的材料较为有限,对于一个独立学习LBM模式的初学者非常不友好(我就是这个初学者哈哈),因此萌生了写一篇保姆级的LBM模式教程,并将我踩过的坑一一指出,有助于后来者更快地上手该模式,而非半途而废。

weixin_42762673的博客 1万+

java中synchronized同步锁实现生产者消费者模式

synchronized介绍 一、基本概念 synchronized关键字是java里面用来在多线程环境下保证线程安全的同步锁;java里面有对象锁和类锁,对象锁是用在对象实例的方法上或者一个对象实例上的,而类锁是用在一个类的静态方法上或者一个类的class对象上的。所以对于对象锁,不同的实例对象的对象锁不同,但是类锁只有一个,所有的对象实例共享这个类锁 二、synchronize使用场景 1、修饰类中的普通方法:在类中的普通方法上加上synchronized修饰,锁对象是调用当前同步方法的对象实例,线程

qq_44682657的博客 3730

Pythia: A Customizable Hardware Prefetching Framework Using Online Reinforcement Learning——“预取”论文解读

参考传送门: 1. Hardware Prefetching笔记 2. 全球百科——缓存预取 3. 百度百科——缓存数据预期技术 目录0. 什么是Hardware Prefetching(本节内容不包括在论文中)1. 简介1.1 关于Hardware Prefetching的一些关键信息1.2 现阶段方法的缺陷1.3 论文团队的目标1.4 核心思想2. 必要的背景知识介绍2.1 强化学习(Reinforcement learning)2.2 为什么说强化学习是一个好的解决思路3. 解决方法与思路3.1 Py

Pinkgranite86的博客 2166

YOLO11实战 第010期-基于yolo11的农业杂草作物目标检测实战文档(详细教程)

通过这条曲线,用户可以评估模型的检测能力,分析模型在不同阈值下对真实目标的检测是否全面。通过这条曲线,可以评估模型在目标检测任务中的整体性能,并找到合适的置信度阈值,以在精确率和召回率之间做出最佳平衡。PR 曲线越接近右上角,模型性能越好,曲线下方的面积越大,说明模型在不同置信度下的。),它展示了不同置信度下的召回率。条曲线都显示了随着召回率的增加,精确度略有下降的趋势,但整体上精确度保持在很高的水平。通过这条曲线,可以选择合适的置信度阈值,以优化模型的检测结果,平衡精确率和召回率。反映了分类器的准确性。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 1522

使用synchronized关键字实现生产者-消费者模型

synchronized是Java语言的关键字。当它用来修饰一个方法或者一个代码块的时候,能够保证在同一个时间,只有一个线程可以进行操作。多线程的同步机制对资源进行加锁,同步用以解决多个线程同时访问时可能出现的问题。 对于普通同步方法,锁的是当前实例对象(中所有加同一把锁的方法)。 对于静态同步方法,锁的是当前类的Class对象(中所有加同一把锁的方法)。 对于同步块,锁的是Synchonized括号里配置的对象。

大草的博客 1007

【技术解析】华为智算中心:昇腾AI算力与无损网络如何驱动大模型训练

本文深入解析了华为智算中心如何通过昇腾AI算力与超融合以太无损网络的协同,驱动千亿参数大模型的高效训练。昇腾NPU提供专用计算引擎,而基于RoCE的无损网络则通过PFC、ECN等技术确保万卡集群间的高带宽、零丢包通信,实现算力利用率最大化,解决大规模AI训练的核心瓶颈。

weixin_29311017的博客 192

Juc02_Synchronized、ReentrantLock实现生产者和消费者问题

①. 生产者消费者模式是一个十分经典的多线程协作的模式,弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻。所谓生产消费者问题,实际上主要是包含了两类线程:一类是生产者线程用于生产数据一类是消费者线程用于消费数据②. 为了耦合生产者和消费者的关系,通常会采用共享的数据区域,就像一个仓库生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为消费者只需要从共享数据区中获取数据,并不需要关心生产者的行为③.线程四句口诀掌握。

qq_46265096的博客 523

NSGA-III相关笔记

NSGA-III目录目的区别NSGA-III的算法流程非支配排序详解归一化详解 目录 NSGA-III基于matlab的实现 参考文献 1.An Evolutionary Many-Objective Optimization Algorithm Using Reference-point Based Non-dominated Sorting Approach,Part I: Solving P...

weixin_42555400的博客 1万+

PCL K4PCS算法实现点云粗配准【2026最新版】

K4PCS算法实现点云粗配准。博客长期更新,本文最近一次更新时间为:2026年5月4日。

点云侠的博客 42万+

java多线程并发 : 生产者-消费者模型的三种实现方式

生产者生产数据到缓冲区中,消费者从缓冲区中取数据。 如果缓冲区已经满了,则生产者线程阻塞; 如果缓冲区为空,那么消费者线程阻塞。 方式一:synchronized、wait和notify package day4; //wait 和 notify public class ProducerConsumerWithWaitNofity { public static void main(String[] args) { Resource resource = new Resource

火星男孩的分享空间 3160

Attention优化|2w字原理&图解: 从Online-Softmax到FlashAttention V1/V2/V3

本文通过原理分析和图解的方式,通俗易懂地FlashAttention系列算法。FlashAttention V1/V2在LLM领域的应用已经非常广泛,相关的论文也反复读了几遍。FA1和FA2论文非常经典,都推荐读一下(不过FA2论文中公式错误不少本文大约1.8w字,包括以下内容:0x07 分布式训推使用FlashAttention0x09 FlashAttention中MQA/GQA以及Causal Mask处理。

具身机器人和通用AI 5232

【JUC基础】06. 生产者和消费者问题

学习JUC,就不得不提生产者消费者。生产者消费者模型是一种经典的多线程模型,用于解决生产者和消费者之间的数据交换问题。在生产者消费者模型中,生产者生产数据放入共享的缓冲区中,消费者从缓冲区中取出数据进行消费。在这个过程中,生产者和消费者之间需要保持同步,以避免数据出现错误或重复。今天我们就来说说生产者消费者模型,以及JUC中如何解决该模型的同步问题。

有一只柴犬的专栏 1207

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JUC并发编程-线程和进程、Synchronized 和 Lock、生产者和消费者问题

什么是JUC、线程和进程、Lock锁、生产者和消费者问题

小孔靠得住的博客 1088

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【JUC基础学习笔记】

JUC基础学习笔记一、JUC概述1. JUC是什么2. 进程与线程3. 并发与并行4. sleep() 和 wait()等方法二、Lock1. Synchronized2. Lock接口与方法3. 两者异同4. Lock接口重要实现类三、线程通信 / 线程同步1. Synchronized同步块2. Lock锁四、线程安全1. 阻塞同步2. 非阻塞同步3. 非同步五、集合的线程安全1. 并发集合 ArrayList2. Vector3. Collections4. JUC.CopyOnWriteList..

sixteen_16的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Synchronized 和 JUC实现生产者、消费者问题

Synchronized版本 当只有两个线程的时候, 是没有问题的, 当时线程数量变多后, 就会出现问题 // 示意生产者、消费者问题 public class demo01 { public static void main(String[] args) { data data = new data(); new Thread(() -> { ...

cyt 337

狂神JUC——Synchronized版的生产者和消费者问题

package com.company; /** * 消费者和生产者:线程之间的通信问题 * 等待唤醒,通知唤醒 * 不同的线程操作同一个变量 */ public class ProducerAndConsumer { public static void main(String[] args) { Data data = new Data(); //添加线程 new Thread(()->{ for (i

黄坤的博客 1063

【JUC学习】——生产者消费者问题

  生产者消费者问题用于很好的解释线程间通信的问题,大致意思可以解释为如果货架上物品为空,则通知生产者开始生产物品,如果货架上的物品满了,就通知消费者进行消费。在JUC中实现主要是通过synchronized和lock实现,对于synchronized,一般采用wait(等待)和notify(唤醒)进行线程的同步通信。在juc并发包下对应的lock方法为await和signal,同时使用资源监视器Condition来进行精准唤醒。 一、Synchronized(wait和notify) 下面看一下第一版的

时光、疏离了记忆づ童话的博客 507

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

3、Lock锁(重点)3.1、传统synchronized本质: 队列和锁,放在方法上锁的是this,放在代码块中锁的是()里面的对象3.2、Lock 接口非公平锁:NonfairSync()公平锁:FairSync()//无参默认非公平锁//传参为true为公平锁3.3、synchronized 和 lock 区别| 比较 | Lock | synchronized || 类型 | java接口 | 内置关键字 || 开启释放 | 显式锁手动 开启 和 关闭 | 隐式锁。

2401_84301853的博客 990

JUC生产者消费者问题

juc版本和synchronized版本的区别: juc这里使用锁需要事先在类里面声明锁,然后用锁获取newCondition,使用condition类即可,以下是jdk,api里面写的 例如,假设我们有一个有限的缓冲区,它支持put和take方法。 如果在一个空的缓冲区尝试一个take ,则线程将阻塞直到一个项目可用; 如果put试图在一个完整的缓冲区,那么线程将阻塞,直到空间变得可用。 我们希望在单独的等待集中等待put线程和take线程,以便我们可以在缓冲区中的项目或空间可用的时候使用仅通知单个线程

qq_42388853的博客 190

JUC(2)生产者消费者问题:Synchronized和JUC版本

生产者消费者问题 Synchronized 版本 wait notify /** * 线程之间的通信问题:走产者和消费者问题.等待唤醒,通知唤醒! * 线程交替执行! A B两个线程操作同一个变量;当A num+1时,必须告知B num-1 */ public class ProviderAndConsumer { public static void main(String[] args) { Data data = new Data(); new Thr

我不想学习但是必须学习 174

JUC(一)

文章目录1、JUC简介2、线程和进程3、Lock锁(重点)3.1、传统的synchronized锁:队列锁3.2、Lock接口3.3、synchronized和Lock锁的区别4、生产者和消费者问题4.1、生产者和消费者:synchronized版4.2、JUC版的生产者和消费者4.3、Conditional实现精准的通知唤醒5、关于锁的八种现象6、不安全的集合类6.1、List6.2、Set6....

持续Java学习中 4109

JUC详解-3-生产者消费者问题(Synchronized&Lock-Condition)

JUC详解 -> 生产者消费者问题 面试必问:单例模式、排序算法、生产者消费者问题、死锁 1. Synchronized版生产者消费者问题 /** * 线程之间的通信问题:生产者和消费者问题! * 线程交替执行 * 线程A、B 操作同一个变量 +1/-1 * 等待唤醒、通知唤醒 */ public class Demo01 { public static void main(String[] args) { Data data = new Data();

baidu_38126306的博客 233
上一篇: 奥利给!搞定JVM就靠它了!不看感觉错过一个亿!吐血整理两个月,原创!全网第一份超详细JVM知识点导图!!!
下一篇: JUC练习代码-JUC版本实现生产者消费者问题
老张聊天
博客等级 码龄18年 92粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值