黑马程序员_日记16_Java多线程(六)

【苍穹外卖 | 项目日记】第一天 我打算用16天的时间写完黑马程序员的苍穹外卖项目,为了督促自己每天坚持写以及记录项目知识点,所以用这种项目日记的方式。 阅读详情

 ——- android培训、java培训、期待与您交流! ———-

死锁

一、基本概念

死锁是什么呢?
两个线程分别持有一个资源,
并同时请求得到对方的资源。
在这种情况下产生的不正常情况就叫做死锁。

死锁在什么情况下会发生呢?
死锁在同步嵌套同步的情况下会发生。
至少有2把锁,才会产生死锁。

二、死锁实例1

首先,以前面售票的例子展示一下死锁。

class Ticket implements Runnable
{
    private  int tick = 1000;
    Object obj = new Object();
    boolean flag = true;
    public  void run()
    {
        if(flag)
        {
            while(true)
            {
                synchronized(obj)
                {
                    show();
                }
            }
        }
        else
            while(true)
                show();
    }
    public synchronized void show()//this
    {
        synchronized(obj)
        {
            if(tick>0)
            {
                try{Thread.sleep(10);}catch(Exception e){}
                System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
            }
        }
    }
}


class  DeadLockDemo
{
    public static void main(String[] args) 
    {

        Ticket t = new Ticket();

        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        t1.start();
        try{Thread.sleep(10);}catch(Exception e){}
        t.flag = false;
        t2.start();


    }
}

运行结果见下图
这里写图片描述

如图所示,票额为1000张,但是卖到984的时候就卡主动不了了,
说明发生了死锁。

三、死锁实例2

下面我自己写了一个简答的例子,来测试死锁。

//建立一个锁类,注意:锁就是对象,在这里使用Object类的对象
class MyLock
{
    //建立两把锁,注意为了调用方便,使用static修饰
    static Object locka = new Object();
    static Object lockb = new Object();
}

//建立一个会产生死锁的类
class MyDeadLock implements Runnable
{
    //设置一个标识来让两个线程各自执行一部分代码
    private boolean flag;

    //利用构造函数传递标识
    MyDeadLock(boolean flag)
    {
        this.flag = flag;
    }
        //覆盖run方法
        public void run()
        {
                //如果标识为true,则该线程执行if部分代码
                if(flag==true)
                {
                    //让程序一直转,直到死锁
                    while(true)
                    {
                            //利用同步代码块嵌套同步代码快制造死锁
                            //因为static修饰了锁,所以可以直接用类名.锁,直接调用对象
                            synchronized(MyLock.locka)
                            {
                                //表示线程在if语句中拿到了locka锁
                                System.out.println("线程:"+Thread.currentThread().getName()+"在if中拿到了 locka.锁......");
                                synchronized(MyLock.lockb)
                                {
                                    //表示线程在if语句拿到了lockb锁
                                    System.out.println("线程:"+Thread.currentThread().getName()+"在if中拿到了 lockb锁......");
                                }
                            }
                    }
                }
                //否则执行else的这部分代码
                else
                {
                    //让程序一直转,直到死锁
                    while(true)
                    {
                            //利用同步代码块嵌套同步代码快制造死锁
                            synchronized(MyLock.lockb)
                                {
                                    //表示线程在else语句中拿到了lockb锁
                                    System.out.println("线程:"+Thread.currentThread().getName()+"在else中拿到了lockb锁.....");
                                    synchronized(MyLock.locka)
                                    {
                                        //表示线程在else语句拿到了locka锁
                                        System.out.println("线程:"+Thread.currentThread().getName()+"在else中拿到了lockb锁.....");
                                    }
                                }
                    }
                }
        }

}







class MyDeadLockDemo 
{
    public static void main(String[] args) 
    {
        //通过线程类建立线程对象,并将实现了接口Runnable类的对象作为实际参数传递进去
        Thread t1 = new Thread(new MyDeadLock(true));
        Thread t2 = new Thread(new MyDeadLock(false));

        //调用start方法,启动线程1
        t1.start();

        //为了让程序多运行一会儿再死锁
        try{Thread.sleep(10);}catch(Exception e){}

        //调用start方法,启动线程1
        t2.start();
    }
}

运行结果
线程:Thread-0在if中拿到了 locka.锁……
线程:Thread-0在if中拿到了 lockb锁……
线程:Thread-0在if中拿到了 locka.锁……
线程:Thread-0在if中拿到了 lockb锁……
线程:Thread-0在if中拿到了 locka.锁……
线程:Thread-0在if中拿到了 lockb锁……
线程:Thread-0在if中拿到了 locka.锁……
线程:Thread-0在if中拿到了 lockb锁……
线程:Thread-0在if中拿到了 locka.锁……
线程:Thread-1在else中拿到了lockb锁…..

结果显示:当线程Thread-1刚跑起来,就立刻造成了死锁

四、小结

在了解了死锁的原理之后,以后下程序的时候就一定注意
避免死锁的发生,这样才能保证程序的安全性。

黑马点评redis改 part 1 举个例子,我们的首页,商户的详情页,那么这些都是不需要登录就能看的,那么这样拦截器就不生效,那么它就不会去刷新。将hmdp.sql导入(本人是mysql8.0.27版本),即可看到包括tb_user:用户表,tb_user_info:用户详情表,tb_shop:商户信息表,tb_shop_type:商户类型表,tb_blog:用户日记表(达人探店日记),tb_follow:用户关注表,tb_voucher:优惠券表,tb_voucher_order:优惠券的订单表 的一共11个表。 阅读详情

相关推荐

STM32H743VIT6最小系统板PCB设计全流程(AD09实战教程+封装库分享)

本文详细介绍了基于STM32H743VIT6高性能MCU的最小系统板PCB设计全流程。内容涵盖从项目规划、原理图设计到PCB布局布线的AD09实战操作,重点解析了高速电路设计中的电源、时钟、去耦等关键模块的处理要点与常见陷阱,并分享了经过验证的封装库资源,旨在为工程师提供一套完整、可靠的设计方法与实战参考。

weixin_29194693的博客 118

黑马程序员日记-16

多线程   (1)多线程   A:进程:程序的一次执行过程。   B:线程:线程是进行的执行单元。   C:任何一个应用程序,都至少有一条执行路径。   D:单线程程序:应用程序只有一条执行路径。   E:多线程程序:应用程序有多条执行路径。      (2)jvm启动的时候是多线程的。   假如jvm的启动时单线程的,就可能存在着内存溢出的隐患。所以,jvm启动是多线程的。至少

sinat_32832713的博客 303

stm32驱动NRF24L01_原理+代码解析

NRF24L01是NORDIC公司生产的一款无线通信通信芯片,采用FSK 调制,集成NORDIC自家的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度最高可达到2Mbps。①2.4G全球开放的ISM频段,免许可证使用。②最高工作速率2Mbps,高校的GFSK调制,抗干扰能力强。③126个可选的频道,满足多点通信和调频通信的需要。④内置CRC检错和点对多点的通信地址控制。⑤可设置自动应答,确保数据可靠传输。//NRF24L01寄存器操作命令。

zyc18700766982的博客 2万+

黑马程序员Java基础加强9-16学习日记

1,一个方法接受的参数个数不固定,称为可变参数,其特点是:  (1)只能出现在参数列表的最后;  (2)...位于变量类型和变量名之间,前后有无空格都可以;  (3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。2,增强for循环语

qiyun2012的专栏 374

汽车软件工程师必看:ASPICE流程实战指南(附完整产物清单)

本文为汽车软件工程师提供ASPICE流程实战指南,详细解析如何搭建合规开发环境、各阶段文档产出清单及工具链整合策略。通过实战案例和模板资源,帮助团队高效实施ASPICE标准,提升软件开发质量与效率。

weixin_29230805的博客 469

银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署实战指南

本文详细介绍了银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署的实战指南。通过PXE网络引导技术,实现全自动化、高效率的系统部署,特别适用于企业级数据中心和国产化替代项目。文章涵盖基础环境准备、关键服务配置、Kickstart高级定制及部署测试等核心内容,帮助用户快速掌握批量部署技巧。

weixin_42525637的博客 382

黑马程序员-----java多线程(学习日记)

--------android培训、java培训、期待与您交流! ----------  首先讲一下进程和线程的区别:     进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。     线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。     线程和进程一样分为五个阶段:创

nether009的专栏 473

新手必看!华为S5700交换机健康检查清单:从CPU到日志的完整巡检流程

本文为新手网管人员提供华为S5700交换机的健康检查完整指南,涵盖CPU、内存、温度、日志等核心指标的日常维护流程。通过详细的display命令和实用案例,帮助用户快速掌握设备体检技巧,确保交换机稳定运行。

weixin_29251337的博客 237

黑马程序员java学习日记2

public class Test { //成员变量是在类体的变量部分中定义的变量,也称为属性。 int c = 12; public static void main(String [] args){ //声明了一个变量, 局部变量 int a = 12; a = 15; System.out.println(a); //变量的作用域是变量的生命期和作用范围

黑马程序员学习 454

WSL2迁移后用户名不见了?一招教你快速恢复Ubuntu22.04默认用户

本文针对WSL2迁移后Ubuntu 22.04默认用户名丢失的常见问题,提供了详细的诊断与修复方案。通过分析迁移底层逻辑,指导用户使用`ubuntu2204.exe config --default-user`命令或配置`/etc/wsl.conf`文件快速恢复用户身份,并涵盖权限修复、冲突解决及自动化迁移脚本等进阶内容,确保子系统迁移后环境完整可用。

web39explorer的博客 558

遥感生态指数(RSEI)——四个指数的计算

遥感生态指数是在4个生态指数的基础上通过主成分变换得出的一个评价生态环境质量的指标。因此,第二部分就是要分别计算出这4个指数的值。 ①首先,是绿度指数的计算,一般用归一化植被指数(NDVI) NDVI=(NIR-Red)/(NIR+Red) 在Bandmath工具中输入NDVI计算公式 (float(b4-b3))/(b4+b3) 其中,b3、b4分别是红波段和近红外波段 ②其次,是湿度计算。 WET = c1B1 + c2B2 + c3B3...

qq_41978498的博客 9万+

黑马程序员--【学习日记五】——多线程

线程与进程线程安全死锁线程间通信等待唤醒机制停止线程守护线程、join方法、优先级,yield 1)线程与进程: 进程:是一个正在执行中的程序。一个控制单元。 线程:就是进程中的一个独立的控制单元,线程控制进程的执行。 一个进程中至少有一个线程。 自定义线程方式一,继承Thread 步骤:  1,定义类继承Thread。  2,复写Thread类中的run方法

u013587258的专栏 487

用 CDS View I_APARToleranceGroup 管理客户与供应商收付差异容差:配置语义、字段解读与 ABAP 落地实践

财务共享服务中心常面临小额差异处理的挑战,SAP通过"客户/供应商容差组"机制实现自动清账规则配置。CDS视图I_APARToleranceGroup将配置数据转化为可查询维度,包含宽限天数、固定现金折扣等关键业务参数。该视图支持按公司代码和容差组查询差异处理策略,可用于报表开发、主数据校验和接口合规检查,帮助财务团队高效管理海量小额交易差异,减少手工操作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 127

黑马程序员--Java学习日记之网络编程

                                                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、网络编程概述 1、计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网

Memor_的博客 896

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

黑马程序员--Java学习日记之GUI&网络编程

------- android培训、java培训、期待与您交流! ---------- GUI 如何创建一个窗口并显示  Graphical User Interface(图形用户接口)。    Frame f = new Frame(“my window”); f.setLayout(new FlowLayout());//设置布局管理器

MH_LZX001的博客 552

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

黑马程序员java学习日记——基本常识(二)

------- android培训、java培训、期待与您交流! ---------- 一、标识符 就是自己在完成相应的程序功能的时候为了方便描述相应的内容我们自己起的名字。 Java中标识符的名称规则: ①包名:多单词组成时所有字母都小写。 xxxyyyzzz ②类名接口名:多单词组成时,所有单词的首字母大写。 XxxYyyZzz ③变量名和函数名

u010607533的专栏 642

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

黑马程序员--【学习日记四】——java面向对象(二)

1)单例设计模式 1: 1: class Single{ 2: 2: private Single(){}; 3: 3: static Single s = new Single(); 4: 4: static Single getInstance(){ 5: 5: return s; 6: 6: } 7

u013587258的专栏 537

黑马程序员_Java学习日记16_IO流4

----------------------android培训、java培训、期待与您交流! --------------------- 1.IO流,打印类 PrintWriter与PrintStream,可以直接操作输入流和文件 /* 打印流:该流提供了打印方法,可以将各种数据类型的数据都原样打印。 字节打印流: PrintStream 构造函数可以接收的参数类型: 1,fil

cdestiny的专栏 372

黑马程序员-学习日记(多线程间的通信)

------Java EE培训、Android培训、iOS培训、期待与您交流! ------- 示例: //将资源封装成对象 class Resour { String name; String gender; } //将线程执行的任务封装成对象 class Input implements Runnable { private Res...

weixin_30569033的博客 86

黑马程序员_学习日记16_JavaScript

JavaScript是在浏览器端执行的语言。 JavaScript和Java没直接关系。 JavaScript 是解释型语言。   csc.exe编译C#运用程序   script type="text/javascript">         alert(new Date().toLocaleDateString()); script> js文件的引用: script

Jack's Domain 373

黑马程序员————学习日记【16】 【银行业务调度系统】

------- android培训、java培训、期待与您交流! ----------   一、项目需求:   二、思路分析:   三、画图理解:   四、代码实现步骤: 1、NumberManager类 package cn.itcast.bankqueue; import java.util.ArrayList; import java.util.L

xinghuo189的专栏 507

黑马程序员java学习日记十一 IO流

一、IO流的三种分类方式 1.按流的方向分为:输入流和输出流 2.按流的数据单位不同分为:字节流和字符流 3.按流的功能不同分为:节点流和处理流 二、IO流的四大抽象类: 字符流:Reader Writer 字节流:InputStream(读数据) OutputStream(写数据) 三、缓冲流:缓冲流要套接在相应的节点流之上,提高了读写的效率。 此处理流的构造方法都得传相对应的

u011532797的专栏 613

黑马程序员_日记9_Java学习感言

——- android培训、java培训、期待与您交流! ———-学习感言原计划快速看一遍JAVASE视频复习一下,然后直接面试。但是从16号到今天,已经10天了,我才刚刚完成10天的学习。冷静下来,仔细想想还是方法有问题。前段时间听课都没有压力,也就没有经常动手练习,但是累积到做练习四的时候,才发现并不是很熟练,于是沉下心来花了2天的时间回头把所有的练习都不使用eclipse运行一遍,现在感觉基础

itheima_1llt的专栏 713

黑马程序员——学习日记1——编程基础

android培训、java培训、期待与您交流!

r243339161的专栏 421

【黑马点评|项目日记】第二天 完成短信登录

文章摘要:本文介绍了如何通过Nginx、Tomcat、MySQL和Redis构建高并发项目,并详细说明了基于Session的登录流程及其存在的问题。首先,Nginx作为负载均衡和静态资源服务器,有效分担Tomcat的压力,而Redis集群则用于缓解MySQL的高并发压力。接着,文章展示了如何通过Session实现短信验证码发送、登录拦截和用户信息隐藏等功能,但指出了Session共享问题,即多台Tomcat服务器之间Session数据不同步的难题。最后,提出了使用Redis替代Session的解决方案,通过

2303_78970037的博客 1042

黑马程序员学习日记 (二)java语言基础

------- android培训、java培训、期待与您交流! ---------- 2.1 关键字 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class interface byte short int long  float double ch

木凡的、天空 530
上一篇: 黑马程序员_日记15_Java多线程(五)
下一篇: 黑马程序员_日记17_Java多线程(七)
回到未来2020
博客等级 码龄12年 27粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值