码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 暑期JAVA学习(34)线程同步


    线程同步

      • 一、同步思想概述
          • (1)为什么要使用线程同步呢?
          • (2)上篇文章中取钱案例出现问题的原因?
          • (3)如何才能保证线程安全呢?
          • (3)线程同步的核心思想是什么?
      • 二、线程同步方式一:同步代码块
          • (1)作用
          • (2)原理
          • (3)格式
          • (4)具体使用
          • (5)锁对象要求
          • (6)锁对象用任意唯一的对象好不好呢?
          • (7)锁对象的规范要求
          • (8)同步代码块是如何实现线程安全的?
      • 三、线程同步方式二:同步方法
          • (1)作用
          • (2)原理
          • (3)格式
          • (4)具体使用
          • (5)同步方法底层原理
          • (6)同步方法是如何保证线程安全的?
          • (7)同步方法的同步锁对象的原理?
          • (8)是同步代码块好还是同步方法好一点?
      • 四、线程同步方式三:Lock锁
          • (1)Lock锁概述
          • (2)Lock的API
          • (3)具体使用

    一、同步思想概述

    (1)为什么要使用线程同步呢?

    ●为了解决线程安全问题

    (2)上篇文章中取钱案例出现问题的原因?

    ●多个线程同时执行,发现账户都是够钱的。

    (3)如何才能保证线程安全呢?

    ●让多个线程实现先后依次访问共享资源,这样就解决了安全问题

    (3)线程同步的核心思想是什么?

    ●加锁,把共享资源进行上锁,每次只能一个线程进入访问完毕以后解锁,然后其他线程才能进来。

    二、线程同步方式一:同步代码块

    (1)作用

    ●把出现线程安全问题的核心代码给上锁

    (2)原理

    ●每次只能一个线程进入,执行完毕后自动解锁,其他线程才可以进来执行

    (3)格式

    在这里插入图片描述

    (4)具体使用

    在这里插入图片描述
    在这里插入图片描述

    使用同步代码块把出现线程安全问题的核心代码给上锁,运行时就不会出现银行倒贴100000的情况啦~

    (5)锁对象要求

    ●理论上:锁对象只要对于当前同时执行的线程来说是同一个对象即可

    (6)锁对象用任意唯一的对象好不好呢?

    ●不好,会影响其他无关线程的执行

    (7)锁对象的规范要求

    ●规范上:建议使用共享资源作为锁对象。
    ●对于实例方法建议使用this作为锁对象。
    ●对于静态方法建议使用字节码(类名.class)对象作为锁对象。

    对于实例方法:
    在这里插入图片描述

    对于静态方法:
    在这里插入图片描述

    (8)同步代码块是如何实现线程安全的?

    ●对出现问题的核心代码使用synchronized进行加锁
    ●每次只能一个线程占锁进入访问

    三、线程同步方式二:同步方法

    (1)作用

    ●把出现线程安全问题的核心方法给上锁

    (2)原理

    ●每次只能一个线程进入,执行完毕以后自动解锁,其他线程才可以进来执行

    (3)格式

    在这里插入图片描述

    (4)具体使用

    在这里插入图片描述
    在这里插入图片描述

    (5)同步方法底层原理

    ●同步方法其实底层也是有隐式锁对象的,只是锁的范围是整个方法代码。
    ●如果方法是实例方法:同步方法默认用this作为的锁对象。但是代码要高度面向对象!
    ●如果方法是静态方法:同步方法默认用类名.class作为的锁对象。

    (6)同步方法是如何保证线程安全的?

    ●对出现问题的核心方法使用synchronized修饰
    ●每次只能一个线程占锁进入访问

    (7)同步方法的同步锁对象的原理?

    ●对于实例方法默认使用this作为锁对象。
    ●对于静态方法默认使用类名.class对象作为锁对象。

    (8)是同步代码块好还是同步方法好一点?

    ●同步代码块锁的范围更小,同步方法锁的范围更大。

    四、线程同步方式三:Lock锁

    (1)Lock锁概述

    ●为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock,更加灵活、方便。
    ●Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作。
    ●Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来构建Lock锁对象。

    方法名称说明
    public ReentrantLock​()获得Lock锁的实现类对象

    (2)Lock的API

    方法名称说明
    void lock()获得锁
    void unlock()释放锁

    (3)具体使用

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    大数据知识面试题-Azkaban(2022版)
    CRM如何帮助企业提高客户满意度?
    C语言,洛谷题,压缩技术2.0
    java诊断工具
    redis GEO使用及基本原理——实现对经纬度的操作
    python多进程编程
    R语言dplyr包filter函数过滤dataframe数据中指定数据列的内容为(等于指定向量中的其中一个)在指定列表中的数据行
    YOLOv5算法改进(2)— 注意力机制介绍(SE、CBAM和CA)
    30.2.1 使用CREATE USER语句创建用户
    【c++刷题Day2】专题3栈与队列&单调栈与单调队列
  • 原文地址:https://blog.csdn.net/xjl243636988/article/details/126046049
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号