Java多线程的生命周期,同步互斥锁机制(Lock,synchronized)

news2025/1/23 10:32:21

目录

  • 1.线程的生命周期
  • 2.线程的同步
    • 1.同步代码块
    • 2.同步方法
  • 3.Lock锁
  • 4.生产者与消费者问题
    • 1.常见方法
    • 2.等待唤醒机制的代码实现
  • 5.阻塞队列

1.线程的生命周期

Java虚拟机中线程分为六个状态,转换关系如下:
①新建
②就绪
③阻塞
④终止
⑤等待
⑥计时等待

运行态(Java虚拟机中没有定义运行状态)

在这里插入图片描述

2.线程的同步

等同于操作系统中进程对临界资源的互斥操作,防止进程发生死锁,从而导致操作系统不安全。
同理线程的同步也是如此。

1.同步代码块

将操作共享数据的代码锁起来。synchronized(锁)实现线程的同步互斥。
①锁的状态默认打开,当一个进程占用时,锁自动关闭。
②共享代码全部执行完毕之后,线程出来,锁自动打开。
锁的定义要唯一

在这里插入图片描述

2.同步方法

synchronized关键字加到方法上

在这里插入图片描述

特点:①同步方法是锁住方法里面的所有代码。
②锁的对象不能自己指定。
非静态:this,静态:当前类的字节码文件对象。

注:StringBuilder是单线程,不同步的,StringBuffer是多线程,同步的。

3.Lock锁

JDK5以后提供一个新的锁对象Lock。
Lock中提供获得锁和释放锁的方法:
void lock():获得锁
void unlock():释放锁

Lock是接口不能直接实例化的,这里采用它的实现类ReentrantLock来实例化。

    Lock lock = new ReentrantLock();

4.生产者与消费者问题

见博主操作系统专栏中:进程同步互斥之生产者与消费者问题: https://blog.csdn.net/qq_61888137/article/details/133691739

1.常见方法

在这里插入图片描述

2.等待唤醒机制的代码实现

案例:厨师做面条,吃货吃面条,缓冲区为桌子,大小为10。
厨师Cook类:

public class Cook extends Thread {

    @Override
    public void run() {
        while (true) {
            synchronized (Desk.lock) {
                if (Desk.count == 0) {
                    break;
                } else {
                    //判断桌子上是否有事物
                    if (Desk.foodFlag == 1) {
                        //如果有,就等待
                        try {
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    } else {
                        //如果没有,就制作事物
                        System.out.println("厨师做了一碗面条");
                        //修改桌子上的事物状态
                        Desk.foodFlag = 1;
                        //叫醒等待的消费者开吃
                        Desk.lock.notifyAll();
                    }
                }
            }
        }

    }
}

吃货Foodie类:

public class Foodie extends Thread {
    @Override
    public void run() {

        while (true) {
            synchronized (Desk.lock) {
                if (Desk.count == 0) {
                    break;
                } else {
                    //判断桌子上是否有面条
                    if (Desk.foodFlag == 0) {
                        //没有,继续等待
                        try {
                            Desk.lock.wait();//当前进程和锁进行绑定
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    } else {
                        //总数减一
                        Desk.count--;
                        //有面条就开吃
                        System.out.println("吃货在吃面条,还能再吃" + Desk.count + "碗");
                        //吃完唤醒厨师继续做
                        Desk.lock.notifyAll();
                        //修改桌子状态
                        Desk.foodFlag = 0;
                    }
                }
            }
        }
    }
}

缓冲区桌子Desk类:

public class Desk {
    //是否有面条:1表示有,0表示没有
    public static int foodFlag = 0;
    //总量
    public static  int count = 10;
    //锁对象
    public static Object lock = new Object();
}

主函数main:

public class Main{
    public static void main(String[] args) {
        //创建线程对象
        Cook c = new Cook();
        Foodie f = new Foodie();
        //给线程设置名字
        c.setName("厨师");
        f.setName("吃货");
        //开启线程
        c.start();
        f.start();
    }
}

运行控制台结果:
在这里插入图片描述

5.阻塞队列

阻塞队列一共实现了四个接口,从上到下依次是:

在这里插入图片描述

阻塞队列有两个实现类:
ArrayBlockingQueue:底层是数组,有界。
LinkedBlockingQueue:底层是链表,无界,最大为int的最大值。

        //创建阻塞队列
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端如何安全的渲染HTML字符串

在现代的Web 应用中&#xff0c;动态生成和渲染 HTML 字符串是很常见的需求。然而&#xff0c;不正确地渲染HTML字符串可能会导致安全漏洞&#xff0c;例如跨站脚本攻击&#xff08;XSS&#xff09;。为了确保应用的安全性&#xff0c;我们需要采取一些措施来在安全的环境下渲染…

fpga xvc 调试实现,支持多端口同时调试多颗FPGA芯片

xilinx 推荐的实现结构方式如下&#xff1a; 通过一个ZYNQ运行xvc服务器&#xff0c;然后通过zynq去配置其他的FPGA&#xff0c;具体参考设计可以参考手册xapp1251&#xff0c;由于XVC运行的协议是标准的TCP协议&#xff0c;这种方式需要ZYNQ运行TCP协议&#xff0c;也就需要运…

C练习——爱因斯坦台阶问题(穷举法)

题目&#xff1a;爱因斯坦曾经提出过这样一道有趣的数学题&#xff1a;有一个长阶梯&#xff0c;若每步上2阶&#xff0c;最后剩下1阶&#xff1b;若每步上3阶&#xff0c;最后剩2阶&#xff1b;若每步上5阶&#xff0c;最后剩下4阶&#xff1b;若每步上6阶&#xff0c;最后剩5…

Java 8 中的 Stream 轻松遍历树形结构!

可能平常会遇到一些需求&#xff0c;比如构建菜单&#xff0c;构建树形结构&#xff0c;数据库一般就使用父id来表示&#xff0c;为了降低数据库的查询压力&#xff0c;我们可以使用Java8中的Stream流一次性把数据查出来&#xff0c;然后通过流式处理&#xff0c;我们一起来看看…

python企业车辆车货信息平台 s05fw

车货信息平台系统可具体分为货源方、平台方、承运方三部分。其中前端要求包含货源方&#xff1a;发布货源信息、选择承运方、司机服务评价&#xff1b;平台方&#xff1a;账户管理、货主、司机资质审核、聊天功能&#xff1b;承运方&#xff1a;车辆信息上传、个人车主发布车源…

uni-app 前后端调用实例 基于Springboot

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

插入排序 InsertionSort

插入排序的原理是默认前面的元素都是已经排序好的&#xff0c;然后从后面逐个读取插入到前面排序好的合适的位置&#xff0c;就相当于打扑克的时候每获取一张牌的时候就插入到合适的位置一样。 以{26,53,48,11,13,48,32,15)为例&#xff0c;插入排序的过程如下所示: 动态演示 …

MySQL基础入门(一)

图片来自b站黑马程序员 数据库操作 DDL 查询&#xff1a; 1.查询所有的数据库 show databases; 2.查询当前的鹅数据库 select database; 创建 create database [if not exists] 数据库名 [default charset 字符集][collate 排序规则]; 删除 drop database [if exists] 数…

flutter开发windows软件字体显示粗细不一样,而且还有繁体解决办法

开始学习flutter开发windows软件&#xff0c;解决出现了下面的情况&#xff0c;字体粗细不一样&#xff0c;而且还有繁体&#xff1f;这是什么情况&#xff0c;在安卓模拟器上都没有问题的啊&#xff0c;怎么到windows上就有问题了&#xff1f;然后就开始踩坑之路。 经研究发现…

CSAPP: LinkBomb 重定位和链接题解(一)

前言 我看了一下&#xff0c;网上关于 LinkBomb 的题解不是很多&#xff0c;LinkBomb 不是 CSAPP 目前大纲的内容&#xff0c;大多数都是写的 LinkLab。如果你做的作业内容是要求每关输出学号&#xff0c;那么你就是跟我一样的 LinkBomb 的实验&#xff08;需要注意的是&#…

汽车保养软件app开发步骤

“增强您的动力&#xff0c;为您的旅程加油——每一刻都讲述着关爱的故事。构建汽车维护软件app&#xff0c;为您的车辆提供数字化的维修站&#xff0c;从而开启长寿之路。智能驾驶、互联驾驶、自信驾驶。” 疯狂地搜索旧收据并猜测上次换油时间的日子已经一去不复返了。如果您…

计算机视觉工程师就业前景如何

计算机视觉主要涵盖了图像处理、模式识别等多个领域&#xff0c;可以应用到很多行业中。随着人工智能技术的快速发展&#xff0c;计算机视觉作为其中的重要分支之一&#xff0c;其就业前景非常广阔。 为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国…

大华主动注册协议介绍

一、大华主动注册协议介绍 前面写了一篇文章&#xff0c;介绍一些设备通过大华主动注册协议接入到AS-V1000的文章&#xff0c;很多问我关于大华主动注册协议的相关知识。 由于大华主动注册协议是一种私有协议&#xff0c;通常不对外公开详细的协议规范和技术细节。因此…

[NISACTF 2022]babyupload

[NISACTF 2022]babyupload wp 信息搜集 进入页面&#xff1a; 尝试文件上传&#xff0c;但是各种后缀名我都试过了&#xff0c;过不去。 在源码中发现提示&#xff0c;存在 ./source 路径&#xff1a; 访问该路径得到源码&#xff1a; from flask import Flask, request, r…

你好,2024!

大家好&#xff0c;我是南城余&#xff01; 今天是2023年最后一天&#xff0c;看到各位大佬都在分享今年的总结&#xff0c;我也来做个年度总结&#xff0c;是第一次做年度总结&#xff0c;希望以后可以每年都做一个好好的回顾。 NO1. 再见&#xff0c;大学&#xff01; 1 2…

计算机毕业设计------SSM游戏点评网站

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,网站用户管理,游戏资讯管理,游戏类型管理,城市信息管理,竞技场管理,游戏信息管理,游戏评价信息管理等功能。…

flowable工作流看这一篇就够了(进阶篇 下)

目录 三、多人会签 3.1、多实例介绍 3.2、基本应用 案例一&#xff08;静态指定数量&#xff09; 案例二&#xff08;动态数量和指派审批人&#xff09; 案例三&#xff08;表达式方式&#xff09; 案例四&#xff08;Java方法控制完成条件&#xff09; 3.3、服务任务 …

布隆过滤器-使用原理和场景

一、概述 布隆过滤器&#xff08;Bloom Filter&#xff09;主要用来检索一个元素是否在一个集合中。它是一种数据结构bitMap,优点是高效的插入和查询&#xff0c;而且非常节省空间。缺点是存在误判率和删除困难。 二、应用场景 1、避免缓存穿透&#xff0c;当redis做缓…

穿越时光的镜头:2023回顾与2024展望

前言 2023 年就像一本充满着惊喜和挑战的书籍&#xff0c;它的每一页都留下了我生活中不同的痕迹。回顾过去&#xff0c;我发现了许多意想不到的成长和启示&#xff0c;也体验了生活的起起伏伏。 这篇文章是对 2023 年的一个小小总结&#xff0c;也是对未来的一点期许。在这里…

训狗技术从初级到高级,专业有效的训狗训犬教程

一、教程描述 现在大部分人家里都会养些宠物&#xff0c;比如狗狗&#xff0c;虽然狗狗的一些行为习惯跟遗传有关&#xff0c;但是主人后天的影响也会给狗狗带来改变&#xff0c;本套教程教你纠正狗狗的不良行为&#xff0c;可以让你与狗愉快地玩耍。本套训狗教程&#xff0c;…