`

锁的讲解

阅读更多

看代码:

public class TestDeadLock implements Runnable{

     int flag = 1;
     static Object o1 = new Object();  //资源1,也称为锁
    static Object o2 = new Object();  //资源2,也称为锁

 public static void main(String[] args) {
      TestDeadLock td1 = new TestDeadLock();
      TestDeadLock td2 = new TestDeadLock();
      td1.flag = 1;
      td2.flag = 0;
      Thread t1 = new Thread(td1);
      Thread t2 = new Thread(td2);
      t1.start();
      t2.start();
 }

 //锁,是个对象,给谁上锁,是给synchronized语句中的代码上锁,
 public void run() {
      if(flag == 1){
           synchronized(o1)
           {
                try {
                      Thread.sleep(1000);
                } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                }

                synchronized(o2){
                    System.out.println("t1 succeed");
                }
           }
      }

     if(flag == 0){
           synchronized(o2){
                try {
                     Thread.sleep(1000);
                } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                }

                synchronized(o1){
                      System.out.println("t2 succeed");
                }
           }
      }
 }

}

 (1)线程t1(td1)就相当于一个人。

 (2)对象o1就相当于一把锁。锁也可称为独占资源。

 (3)synchronized(o1)就相当于屋里的财富。

当线程t1运行到synchronized(o1)中,就相当于这个人走进了屋里,同时把屋的门给锁定(即o1锁定),当线程t1走出synchronized(o1)的代码段后,就相当于这个人走出了屋,同时把锁释放掉,别人(如t2)就可以拥有锁,可以进屋。

 

        我们来看上端代码,t1和t2两个线程,假设首先t1进入run()方法,然后判断flag是否为1,为1则利用对象o1将下面那段代码锁住,与此同时t2进入run()方法,判断flag,为0,则利用o2将下面那段代码锁住,再回过头来,此时t1继续向下执行,执行到synchronized(o2)这,此时o2对象已经被t2锁住,所以o1开始等待o2对象释放锁标记,同理,t2继续往下执行,执行到synchronized(o1)这,也就开始等待o1对象释放锁标记.这样互相等待,就产生死锁.
        注意:如果我把static Object o1 = new Object();前面的static去掉的话,那么就不会发生死锁了,这是因为,这两个线程都有自己的o1,即锁不再是公用的了,所以不会发生死锁了.

分享到:
评论

相关推荐

    oracle锁讲解笔记

    ### Oracle锁机制详解 #### 锁的基本概念与作用 锁机制是Oracle数据库中用于管理并发访问共享资源的关键组件。在多用户环境中,确保数据的一致性和完整性至关重要,尤其是在多个会话试图同时修改相同数据的情况下...

    mysql中的事务、锁讲解和操作

    记录锁锁定特定的行,间隙锁锁定索引之间的间隙,临键锁结合了记录锁和间隙锁,防止幻读,插入意向锁则表明事务打算在指定位置插入数据。 4. 从锁的态度分类,有悲观锁和乐观锁。悲观锁假定并发操作会导致冲突,...

    互斥锁和条件锁的讲解和使用

    本文将深入讲解这两种锁的概念、工作原理以及如何在C语言中使用它们。 首先,互斥锁(Mutex)是一种基本的线程同步机制,用于保护共享资源不被多个线程同时访问。当一个线程获得互斥锁后,其他试图获取同一锁的线程...

    分布式锁原理讲解视频资料

    本视频资料深入浅出地讲解了分布式锁的原理、实现方式以及其在实际应用中的场景。 首先,我们来了解分布式锁的基本原理。分布式锁的目的是解决在分布式环境下,多节点并发访问同一资源时可能出现的数据不一致问题。...

    商务工作讲解PPT

    商务工作讲解PPT,为你解说商务工作的主要内容,可以用于技术培训、新人培训等场合。商务宫锁讲解PPT内容包括招投标全流程详解、合同签订详解等。

    Mysql事务以及锁原理讲解.pdf

    在深入探讨MySQL事务和锁的原理之前,我们首先需要对“事务”的概念有一个基本的理解。事务是一组操作的集合,这些操作要么全部完成,要么全部不做,确保数据库从一种一致性状态转换到另一种一致性状态,而不会留下...

    基于STM32设计的智能门锁(手机开锁、随机密码开锁)-源码包.zip

    上传到CSDN的项目资源,都会有一份完整项目设计文档和一份项目演示的功能讲解视频。 项目专栏地址: https://blog.csdn.net/xiaolong1126626497/category_10192120.html B站视频首页:...

    Mysql事务以及锁原理讲解

    Mysql事务以及锁原理讲解 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种情况。我们把这种要么全做,要么全不做的规则称之为原子性。 对于上面的转账场景,一致...

    深入讲解我们说的CAS自旋锁到底是什么

    深入讲解CAS自旋锁的实现机理和原理 CAS(Compare and Swap)是实现自旋锁或乐观锁的核心操作,它的出现是为了解决原子操作的问题。在多线程环境下,原子操作是保证线程安全的重要手段。CAS操作的实现很简单,就是...

    由D触发器设计的停电自锁电路 + 附电路图讲解.zip

    描述中提到的“电子研发,维修,学习附电路原理讲解”,意味着这个电路设计不仅适用于产品研发,还适用于设备维修和理论学习。电路图和讲解将帮助理解电路的工作原理,这对于电子工程师、维修技术人员以及自学电子...

    闩锁效应的详细讲解,关于闩锁效应很好的一个课件

    闩锁效应(Latch-up)是 CMOS 工艺所特有的寄生效应,会导致电路的失效,甚至烧毁芯片。闩锁效应是由 NMOS 的有源区、P 衬底、N 阱、PMOS 的有源区构成的 n-p-n-p 结构产生的,当其中一个三极管正偏时,就会构成正...

    数据库锁和事务的详细讲解

    详细描述数据库锁和事务的内容,其中包括各种类型的锁的讲述,事务的控制

    基于单片机protues仿真的多功能密码锁系统设计(仿真图、源代码、讲解视频)

    基于单片机protues仿真的多功能密码锁系统设计(仿真图、源代码、讲解视频) 该系统为单片机protues仿真的多功能密码锁系统,实现多功能密码锁设计,并完成上位机和本机的通信功能; 设计要求: 1、可进行密码设置、...

    乐观锁与悲观锁

    介绍数据库事务的定义和事务带来的问题,详细讲解乐观锁与悲观锁的区别

    电子-电子懒人的基础硬件电路图讲解部分电路和下载链接.zip

    《电子懒人基础硬件电路图讲解》集合了各种电子技术的基础知识,涵盖了数字、模拟和高频电路等多个领域,为电子初学者提供了一套全面的学习资源。这个压缩包中包含了一系列电路图及其对应的详细讲解,旨在帮助用户...

    398、基于单片机protues仿真的多功能电子密码锁系统设计(仿真图、源代码、讲解视频、实物程序、实物连接图)

    398、基于单片机protues仿真的多功能电子密码锁系统设计(仿真图、源代码、讲解视频、实物程序、实物连接图) 该系统为单片机protues仿真的多功能电子密码锁系统,实现多功能电子密码锁设计。 设计要求: 1、可进行...

    举例讲解Python编程中对线程锁的使用

    ### Python中的线程锁使用详解 在Python编程中,多线程编程是非常常见的技术手段,尤其是在需要处理大量并发任务或实现资源高效利用时。然而,由于Python解释器本身的全局解释器锁(GIL)机制的存在,同一时刻只有...

    001基于单片机简易电子密码锁资料(包含原理图及程序)

    本资料主要介绍一种基于单片机的简易电子密码锁的设计,它融合了硬件电路与软件编程的精髓,帮助初学者了解并掌握单片机控制技术在实际应用中的运用。 一、单片机基础 单片机,又称微控制器,是一种将CPU、存储器和...

    STM32f407电子密码锁

    本设计主要是基于STM32F407作为主控芯片,通过搭载一个3.2寸的LCD屏,继电器和一个电磁铁锁头组成了一个基于STM32的电子密码锁。...屏幕校准成功屏幕会显示Adjust ...资料内容:开发文档,视频讲解,源代码,硬件连接图

Global site tag (gtag.js) - Google Analytics