线程:Lock接口和死锁

STM32——IIC(I2C)中断与DMA通信实战解析 本文深入解析STM32的IIC(I2C)通信中断与DMA实战应用。通过对比轮询方式的低效,详细介绍中断模式和DMA模式的实现原理、状态机编程技巧及性能优化策略,并结合SHT30传感器案例展示如何高效读取数据,显著提升系统响应速度和CPU利用率。 阅读详情
    1.Lock接口
    java.utils.concurrent包是jdk1.5新增的,用来处理多线程。实现java.util.concurrent.locks.Lock接口的类具有与synchronized关键字同样的功能,但是它更加强大一些。java.utils.concurrent.locks.ReentrantLock是较常用的实现了Lock接口的类。下面是ReentrantLock类的一个应用实例:
  1. package edu.hust.test;
  2. import java.util.concurrent.locks.ReentrantLock;
  3. public class ThreadLock extends ReentrantLock {
  4.     private static final long serialVersionUID = 1L;
  5.     public void execute_lock1() {
  6.         this.lock();
  7.         try {
  8.             for (int i = 0; i < 5; i++) {
  9.                 System.out.println(Thread.currentThread().getName() + " 位于/"同步块/"中 " + i);
  10.                 Thread.sleep(999999999);
  11.             }
  12.         } catch (InterruptedException e) {
  13.             System.out.println("谁把我吵醒了.....");
  14.         } finally {
  15.             this.unlock();
  16.         }
  17.     }
  18.     
  19.     public synchronized void execute_lock2() {
  20.         //lock.lock();
  21.         try {
  22.             for (int i = 0; i < 5; i++)
  23.                 System.out.println(Thread.currentThread().getName() + " 位于/"同步块/"中 " + i);
  24.         } finally {
  25.             //lock.unlock();
  26.         }
  27.     }
  28.     
  29.     public static void main(String[] args) {
  30.         final ThreadLock threadLock = new ThreadLock();
  31.         
  32.         Thread thread1 = new Thread(new Runnable() {
  33.             public void run() {
  34.                 threadLock.execute_lock1();
  35.             }
  36.         }, "红薯Thread");
  37.         
  38.         Thread thread2 = new Thread(new Runnable() {
  39.             public void run() {
  40.                 threadLock.execute_lock1();
  41.             }
  42.         }, "土豆Thread");
  43.         
  44.         Thread thread3 = new Thread(new Runnable() {
  45.             public void run() {
  46.                 threadLock.execute_lock2();
  47.             }
  48.         }, "青菜Thread");
  49.         
  50.         thread1.start();
  51.         thread2.start();
  52.         thread3.start();
  53.     }
  54.     /*
  55.      * 输出结果:
  56.      * 红薯Thread 位于"同步块"中 0
  57.      * 青菜Thread 位于"同步块"中 0
  58.      * 青菜Thread 位于"同步块"中 1
  59.      * 青菜Thread 位于"同步块"中 2
  60.      * 青菜Thread 位于"同步块"中 3
  61.      * 青菜Thread 位于"同步块"中 4
  62.      * */
  63. }
    lock()方法用于锁定对象,unlock()方法用于释放对对象的锁定,他们都是在Lock接口中定义的方法。位于这两个方法之间的代码在被执行时,效果等同于被放在synchronized同步块中。一般用法是将需要在lock()和unlock()方法之间执行的代码放在try{}块中,并且在finally{}块中调用unlock()方法,这样就可以保证即使在执行代码抛出异常的情况下,对象的锁也总是会被释放,否则的话就会为死锁的产生增加可能。
    和synchronized关键字不同,lock只把当前方法锁定,其他的方法(不论是同步还是非同步的)并没有被锁定。

    2.死锁
    死锁就是一个进程中的每个线程都在等待这个进程中的其他线程释放所占用的资源,从而导致所有线程都无法继续执行的情况。死锁是多线程编程中一个隐藏的陷阱,它经常发生在多个线程共用资源的时候。在实际开发中,死锁一般隐藏的较深,不容易被发现。程序中必须同时满足以下四个条件才会引发死锁:
    (1)互斥(Mutual exclusion):线程所使用的资源中至少有一个是不能共享的,它在同一时刻只能由一个线程使用。
    (2)持有与等待(Hold and wait):至少有一个线程已经持有了资源,并且正在等待获取其他的线程所持有的资源。
    (3)非抢占式(No pre-emption):如果一个线程已经持有了某个资源,那么在这个线程释放这个资源之前,别的线程不能把它抢夺过去使用。
    (4)循环等待(Circular wait):假设有N个线程在运行,第一个线程持有了一个资源,并且正在等待获取第二个线程持有的资源,而第二个线程正在等待获取第三个线程持有的资源,依此类推……第N个线程正在等待获取第一个线程持有的资源,由此形成一个循环等待。
  1. package edu.hust.test;
  2. /**
  3.  * @author Forrest He
  4.  * created on 2008-11-17
  5.  */
  6. public class DeadLockDemo implements Runnable {
  7.     int i; //用于判断线程是否被占用
  8.     
  9.     /*
  10.      * 必须是static的, static表示锁住的是Object类; 而非static锁住的是Object的对象, 在这里不符合要求.
  11.      * */
  12.     private static Object print_one = new Object(); //第一台打印机
  13.     private static Object print_two = new Object(); //第二台打印机
  14.     
  15.     public void run() {
  16.         if (i == 0) { //先占用print_one, 并等待print_two
  17.             synchronized (print_one) {
  18.                 System.out.println("print_one已被占用, 正等待print_two");
  19.                 try {
  20.                     Thread.sleep(1000);
  21.                 } catch (InterruptedException e) {
  22.                     System.err.println("谁把我吵醒了!!!");
  23.                 }
  24.                 synchronized (print_two) {
  25.                     System.out.println("已获取print_two, 任务完成");
  26.                 }
  27.             }
  28.         } else if (i == 1) { //先占用print_two, 并等待print_one
  29.             synchronized (print_two) {
  30.                 System.out.println("print_two已被占用, 正等待print_one");
  31.                 try {
  32.                     Thread.sleep(1000);
  33.                 } catch (InterruptedException e) {
  34.                     System.err.println("谁把我吵醒了!!!");
  35.                 }
  36.                 synchronized (print_one) {
  37.                     System.out.println("已获取print_one, 任务完成");
  38.                 }
  39.             }
  40.         }
  41.     }
  42.     
  43.     public static void main(String[] args) {
  44.         DeadLockDemo deadLock_one = new DeadLockDemo();
  45.         DeadLockDemo deadLock_two = new DeadLockDemo();
  46.         deadLock_one.i = 0;
  47.         deadLock_two.i = 1;
  48.         new Thread(deadLock_one).start();
  49.         new Thread(deadLock_two).start();
  50.     }
  51. }
[ROS] rviz 可视化工具 [ROS] rviz 可视化工具 摄像头没讲 文章目录[ROS] rviz 可视化工具1. todo2. todo*. 参考*. 问题解决*. rough 1. todo 2. todo *. 参考 *. 问题解决 *. rough roscore + rviz 阅读详情

相关推荐

接口操作MySQL跟MongoDB事务回滚问题

通常使用的事务注解:@Transactional 是不会对MongoDB生效的,但是在一些生产接口中无法避免同时使用MySQL跟MongoDB的操作。

weixin_45932023的博客 1578

Lock接口详解

java.util.concurrent.locks包下常用的类与接口(lock是jdk 1.5后新增的) Lock和ReadWriteLock是两大锁的根接口,Lock代表实现类是ReentrantLock(可重入锁),ReadWriteLock(读写锁)的代表实现类是ReentrantReadWriteLock Condition 接口描述了可能会与锁有关联的条件变量。这些变量在用法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个 Lock 可

qq_36042938的博客 1722

保姆级教程:用PyBullet在Windows/Mac上快速搭建你的第一个机器人仿真环境(附避坑指南)

本教程详细介绍了如何使用PyBullet在Windows和Mac上快速搭建机器人仿真环境,包括Python环境配置、依赖安装避坑指南、首个机械臂仿真实现及性能优化技巧。通过分步指导和实战代码,帮助初学者轻松入门机器人仿真技术。

weixin_42526087的博客 407

Java多线程(14)——Lock接口详解

1 基本概括 2 主要介绍 2.1 Lock接口的作用 2.1.1 简单介绍 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源,解决数据的一致性问题。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了隐式获取释放锁的便捷...

qq_20761351的博客 569

手机拍照背后的隐形功臣:一文读懂高通ISP三兄弟(IFE/BPS/IPE)如何协同工作

本文深入解析了高通ISP三兄弟(IFE/BPS/IPE)在手机拍照中的协同工作机制。通过拟人化比喻,详细介绍了IFE作为图像前端引擎的分流预处理、BPS作为RAW格式修图师的专业处理,以及IPE作为全能后期制作人的多面功能,揭示了三者在图像处理pipeline中的高效配合与技术创新。

weixin_27032989的博客 528

工业相机与ABB机器人Socket通信实战:手把手教你用RobotStudio 6.08搭建视觉引导工作站

本文详细介绍了工业相机与ABB机器人通过Socket通信实现视觉引导工作站的实战教程。使用RobotStudio 6.08平台,涵盖工作站搭建、坐标系标定、RAPID代码开发及TCP/IP通信配置,特别解析了欧拉角与四元数转换等关键技术难点,助力智能制造产线升级。

weixin_42531516的博客 408

Lock 接口解读

Lock 锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允 许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对 象。Lock 提供了比 synchronized 更多的功能。Lock 不是 Java 语言内置的,synchronized 是 Java 语言的关键字,因此是内置特性。Lock 是一个类,通过这个类可以实现同步访问;

一个菜鸡的博客 610

基于航天宏图PIE-SAR软件的高分三号(GF-3)SAR影像的预处理

软件官网 航天宏图—国内领先的卫星运营与应用服务提供商(官网) 一、数据导入 数据导入-GF-3-根据模式选择 参数文件导入解压后GF-3数据的XML文件 通道自动填充 设置输出目录 确定 等待,加载图像、自动构建金字塔 二、复数数据转换 强度/幅度特征是SAR影像最主要的特征之一,基于SAR强度/幅度影像可以提取地物目标信息,因此需要将SAR复数数据转换为SAR强度/幅度数据。导入输入影像,设置参数类型,输出目录、命名、类型; 漫长的等待 三、多视 为提...

weixin_52127098的博客 9003

多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(下)

      同系列阅读:多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上),多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)       前两篇简单介绍了线程同步lock,Monitor,同步事件EventWaitHandler,互斥体Mutex的基本用法,在此基础上,我们对它们用法进行比较,并给出什么时候需要锁什么时候不需要的几...

weixin_34026484的博客 255

SIMULINK开发项目实例 1000 例专栏之第847例--基于飞行控制与稳定性的场景实例:多旋翼无人机在风扰动下的稳定性分析

本文介绍了使用Simulink进行多旋翼无人机风扰动稳定性分析的完整流程。首先建立包含动力学模型、控制系统和环境模拟三大模块的仿真系统,其中动力学模型基于牛顿-欧拉方程,控制系统采用PID调节器。重点展示了MATLAB函数实现的风扰动模型和姿态控制算法,通过设置输入信号和输出显示模块完成闭环仿真。最后通过多次风速条件下的仿真测试评估控制系统的抗干扰能力和稳定性表现,为无人机控制系统设计提供了有效的仿真验证方法。

xiaoheshang_123的博客 322

jre9下载 jdk9

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

Lock接口的介绍及使用

一、Lock的介绍我们知道,在Java中锁的实现可以由synchronized关键字来完成,但在Java5之后,出现了一种新的方式来实现——Lock接口。那么为什么提出这种新的方式呢? 在多线程的情况下,当一段代码被synchronized修饰之后,同一时刻只能被一个线程访问,其他线程都必须等到该线程释放锁之后才能有机会获取锁访问这段代码,占用锁的线程只有在两种情况下才能释放锁: 线程执行完了

babylove_BaLe的博客 1920

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++ 多线程同步之互斥锁(mutex)实战

本文介绍了C++多线程编程中互斥锁的使用方法。首先通过示例展示了多线程环境下数据竞争问题的产生原因,进而引入互斥锁的概念。文章详细讲解了std::mutex和std::lock_guard的基本用法,并通过售票系统案例演示了互斥锁的实际应用。此外,还分析了死锁产生的四个必要条件,并提供了规避死锁的常用方法。最后强调互斥锁的核心作用是保护临界区代码,确保线程安全。全文提供了多个代码示例,帮助读者理解多线程同步的关键技术。

今天比昨天更努力一点! 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java中多线程安全、同步、死锁、等待唤醒机制

文章目录一、线程安全二、线程同步1.同步代码块2.同步方法(1)普通方法同步(2)静态同步方法三、死锁四、lock接口五、等待和唤醒机制 一、线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码,程序每次运行结果和单线程运行的结果是一样的,而且程序中的变量值和和预期的一样,那么线程就是安全的,如果不是,则线程不安全。 下面通过售票的案例来理解一下线程安全问题 //模拟售票类 pub...

weixin_38356640的博客 270

C++11多线程整理

目录 初识 什么是并发 并发的方式 多进程并发 多线程并发 为什么使用并发 任务拆分 提高性能 多线程库简介 理解线程类的构造函数 构造函数的参数 函数指针 仿函数 匿名函数 std::function 传值还是引用 线程对象只能移动不可复制 竞争条件与互斥锁 竞争条件 使用互斥元保护共享数据 为保护共享数据精心组织代码 接口设计中也存在竞争条件 死锁(Dead Lock) 死锁 unique_lock 条件变量(Condition Variable)

Nicholson的博客 809

java 多线程死锁机制_Java学习 之 多线程(线程安全、同步、死锁、Lock锁、等待唤醒机制)...

1 /*23 线程安全:如果有多个线程在同时运行,而这些线程可能会同时运行这段代码,程序每次运行结果和单线程运行的结果是一样的,45 而且其他的变量的值也和预期的是一样的,就是线程安全的67 线程安全是由全局变量及静态变量引起的,若每个线程中对全局变量、静态变量只有读操作,而无写操作,这个全局变量是线程安全的;89 若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全1011...

weixin_39625429的博客 89

线程间共享数据

互斥量和要保护的数据,在类中都需要定义为private成员,这会让访问数据的代码变的清晰,并且容易看出在什么时候对互斥量上锁。这是面向对象设计的准则:将其放在一个类中,就可让他们联系在一起,也可对类的功能进行封装,并进行数据保护。在C++ STL模板库中,已经实现stack功能,但是std::stack却不是线程安全的,因为stack成员函数存在恶性条件的数据竞争,导致多线程环境下,数据出现错误。,其会在构造的时候提供已锁的互斥量,并在析构的时候进行解锁,从而保证了一个已锁的互斥量总是会被正确的解锁。

weixin_53344209的博客 440

Java 多线程的方法 实现 休眠 加入 礼让 守护线程 线程中断 线程安全 Lock锁

22.01 多线程的实现方式1 A:多线程的实现方式1: a:继承Thread类 b:步骤及代码演示 c:几个小问题: 启动线程使用的是哪个方法 线程能不能多次启动 run()和start()方法的区别 我们启动线程不是使用run方法,而应该是start方法,使该线程开始执行; Java虚拟机调用该线程的 run 方法 为什么要重写run方法? 这个类是一个线程类,那么在这个类中我们能不能写一些其他方法呢? 可以写其他方

weixin_47884045的博客 217

Lock与Synchronized区别

3、Synchronized会自动让线程释放对锁的占用;而Lock需要手动释放锁,不然会出现死锁现象。1、Lock不是java语言内置的,Synchronized是java语言的关键字;2、Lock是一个接口类,通过这个类实现同步访问;2、实现Runnable接口。3、使用Callable接口。1、继承Thread类。

weixin_40228600的博客 145

c++多线程并发学习笔记(1)

共享数据带来的问题:条件竞争 避免恶性条件竞争的方法: 1.对数据结构采用某种保护机制,确保只有进行修改的线程才能看到修改时的中间状态。从其他访问线程的角度来看,修改不是已经完成了,就是还没开始。 2.对数据结构的设计进行修改,修改完的结构必须能完成一系列不可分割的变化,也就是保证每个不变量保持稳定的状态,这就是所谓的无锁编程。 3.使用事务的方式去处理数据结构的更新(这里...

dengyu6263的博客 332

Java多线程安全和死锁

线程生命周期 ➢新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态 ➢就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它己具备了运行的条件,只是没分配到CPU资源 ➢运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run()方法定义了线程的操作和功能 ➢阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中,止自己的执行,进入阻塞状态 ➢死亡:线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结束 线

qq_21543391的博客 244

Java 多线程 笔记

关于Java多线程笔记 还有很多要学

sybBlog 1294

java wait 线程安全吗_Java学习线程安全

线程同步(线程安全处理Synchronized)线程同步的两种方式:1、同步代码块2、同步方法同步代码块同步代码块: 在代码块声明上 加上synchronizedsynchronized(锁对象) {可能会产生线程安全问题的代码}同步代码块中的锁对象可以是任意的对象;但多个线程时,要使用同一个锁对象才能够保证线程安全。package com.oracle.demo01;/*格式:* synchr...

weixin_39629947的博客 183

Java多线程学习笔记

Java多线程学习笔记线程简介普通方法调用和多线程 线程简介 程序时指令和数据的有数集合,其本身没有任何运行的含义,是一个静态的概念。进程则是执行程序的一次执行过程,是一个动态的概念,是系统资源分配的单位。 一个进程中通常会有若干个线程,一个进程中至少有一个线程,不然没有存在的意义,线程是CPU调度和执行的单位。 线程就是独立的执行路径。 在程序运行时即使自己没有创建线程,后台也会有多个线程。main()是主线程,为系统的入口,用于执行整个程序。 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度

qq_50834939的博客 366

多线程入门

目录 1.线程概述 1.什么是进程 2.什么是线程 3.什么是程序 4.并行和并发 2.线程入门 1.多线程创建方式1 2.多线程创建方式2 3.多线程创建方式3(了解) 3.线程状态 4.线程API 1.线程停止 2.线程睡眠 3.线程礼让 4.插入线程 5.线程检测状态 6.线程优先级 7.守护线程 5.什么是线程安全 1.没有线程同步 2.有线程同步 同步代码块 同步方法 7.死锁 1.什么是死锁 2.解决方法 8.Lock(锁) 9.同步练习 1.线程不安全 2.线程安全的 10.线程通信 11.生

qq_56113699的博客 168

Java多线程——安全与死锁问题

实现多线程的方式 线程安全问题中synchronized同步代码块与Lock锁的使用。 解决线程安全问题产生的死锁问题。 若想共享数据源,可以在外界把这个数据源对象创建出来,通过构造方法传递给其他的类。

Thinking Everytime 647

Java 多线程 02 线程安全、同步、死锁

1 线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。 线...

lihaogn的博客 186
上一篇: 线程:sleep()、wait()、yield()和join()方法
下一篇: 多线程运行机制 概要
ForWayfarer
博客等级 码龄20年 60粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值