同步锁

2023-05-16

**线程和进程:**几乎所有的操作系统都支持进程的概念,所有运行中的任务通常对应一个进程(Process)。当一个程序 进入内存运行时,即变成一个进程。而一个线程中又包含多个进程。
多线程的问题:许多在单线程情况下的代码放到多线程环境下容易出现线程安全问题。因为进程之间的先后执行问题。
同步锁(Lock):
从Java5开始,Java提供了一种功能更强大的线程同步机制——通过显式定义同步锁对象来实现同步,在 这种机制下,同步锁由Lock对象充当。 Lock提供了比synchronized方法和synchronized代码块更广泛的锁定操作,Lock允许实现更灵活的结构,可以具有差别很大的属性。 Lock是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。 在实现线程安全的控制中,比较常用的是 ReentrantLock(可重入锁)。使用该Lock对象可以显式地加锁、释放锁。
示例:通过一个简单的取钱步骤,可体现出多线程的问题。
主函数的代码截图:主要实现:定义一个虚拟的账户以及账户余额。两个用来取钱的“A”和“B”账号以及取钱金额。而后执行TakeMoney1类中的方法。然后进行结果返回。
在这里插入图片描述
TakeMoney1 类:
class TakeMoney1 extends Thread{
/

* 谁取钱
/
private String name;
/

* 账户对象
/
private Account account;
/

* 取多少钱
*/
private double takeMoney;
public TakeMoney1(String name,Account account,double takeMoney) {
super();
this.name = name;
this.account = account;
this.takeMoney = takeMoney;
}
TakeMoney1 类中执行取钱的方法:
在这里插入图片描述

这是执行后的结果:由此得出多线程中存在的问题。
在这里插入图片描述

使用同步锁,避免线程冲突问题;
以下是使用同步锁后的代码以及执行结果。
主函数部分不变,TakeMoney1类不变,唯一不同的是TakeMoney1类中执行取钱的方法不同。调用takeMoney方法
在这里插入图片描述

下面的代码截图就是通过同步锁进行取钱的方法。大概的执行思路就是将进程拦住,然后放一个进程进去,等到该进程执行完了以后开锁,再将另一进程进去。
在这里插入图片描述

以下是使用了同步锁,模拟取钱的执行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同步锁 的相关文章

随机推荐

  • Android动态获取手机是否是充电状态

    参考谷歌官方文档 https developer android google cn topic performance power 一 获取充电状态 在应用中执行某些操作 如软件云端备份 从服务器端获取最新版本号 从服务器端缓存最新软件安
  • EF_Using(问题)

    xfeff xfeff using 语句中使用的类型必须可隐式转换为 System IDisposable using 语句中使用的类型必须可隐式转换为 System IDisposable 在使用 EF 出现 using 语句中使用的类型
  • 100个不能错过的实用JS自定义函数

    1 原生JavaScript实现字符串长度截取 代码如下 span class token keyword function span span class token function cutstr span span class tok
  • Android.mk 编译报错undefined reference to

    当出现 undefined reference to xxx时 xff0c 对应的lib库已经添加到LOCAL STATIC LIBRARIES里面 xff0c 且 头文件已经已经添加时 xff0c 仍然报 undefined refere
  • yocto QT5 QSqlDatabase: QSQLITE driver not loaded

    yocto中默认编译出来的qt是不带有sql driver xff0c 即缺少插件库libqsqlite so 修改位置 xff1a 1 在xx meta qt5 recipes qt qt5 qtbase git bb中 xff0c 修改
  • systemd 介绍

    转自 xff1a https www linuxidc com Linux 2018 03 151291 htm 从 init 系统说起 Linux 操作系统的启动首先从 BIOS 开始 xff0c 接下来进入 boot loader xf
  • 详细讲解systemctl(附常用指令)

    目录 写在前面 systemd和systemctl systemd的配置文件目录 主要服务功能类型 服务状态 常用指令 切换系统模式 xff08 文本 界面模式等 xff09 systemctl配置文件的设置 写在前面 我发现systemc
  • Linux中systemctl详细理解及常用命令

    一 systemctl理解 Linux 服务管理两种方式service和systemctl systemd是Linux系统最新的初始化系统 init 作用是提高系统的启动速度 xff0c 尽可能启动较少的进程 xff0c 尽可能更多进程并发
  • ARM AArch64 GUN交叉编译工具下载官网

    Arm Developer https developer arm com tools and software open source software developer tools gnu toolchain gnu a downlo
  • GStreamer系列 - 基本介绍

    什么是Gstreamer xff1f Gstreamer是一个支持Windows xff0c Linux xff0c Android xff0c iOS的跨平台的多媒体框架 xff0c 应用程序可以通过管道 xff08 Pipeline x
  • 探索Android中的Parcel机制(下)

    上一篇中我们透过源码看到了 Parcel 背后的机制 xff0c 本质上把它当成一个 Serialize 就可以了 xff0c 只是它是在内存中完成的序列化和反序列化 xff0c 利用的是连续的内存空间 xff0c 因此会更加高效 我们接下
  • Caused by: java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0 (无法载入的.类

    Caused by java lang UnsupportedClassVersionError com iov common crud node TPSAlipayConfig Unsupported major minor versio
  • ubuntu18 buildroot make xconfig make gconfig faile

    make xconfig sudo apt get install qttools5 dev make gconfig sudo apt get install libglade2 dev
  • qt5的configure选项说明

    一 配置选项查看及初步解释 通过下面命令查看都有哪一些编译配置选项 span class token punctuation span span class token operator span configure span class
  • qt build

    QT笔记 嵌入式QT交叉编译与移植 含OpenGL ES2 https blog csdn net weixin 40293570 article details 117731268
  • OpenGL之gult/freeglut/glew/glfw/glad的联系与区别

    转 https blog csdn net libaineu2004 article details 105879521 转 https blog csdn net qq 40565033 article details 107715956
  • linux arm fdisk, 对未使用emmc分区扩容

    yocto编译后的wic镜像 xff0c 在刷机后 xff0c 仍有很大部分emmc未使用 xff0c 下面将未使用的emmc扩展到文件系统挂载分区 root 64 imx8dxmek df h Filesystem Size Used A
  • Shell脚本 EOF使用

    前言 xff1a EOF是End Of File的缩写 xff0c 表示自定义终止符 既然自定义 xff0c 那么EOF就不是固定的 xff0c 可以随意设置别名 xff0c 意思是把内容当作标准输入传给程序 xff0c Linux中按Ct
  • matlab之将视频逐帧保存为图片

    clc clear all close all 将视频逐帧保存为jpg图片 obj 61 VideoReader 39 F mh rgb avi 39 输入视频位置 numFrames 61 obj NumberOfFrames 帧的总数
  • 同步锁

    线程和进程 xff1a 几乎所有的操作系统都支持进程的概念 xff0c 所有运行中的任务通常对应一个进程 xff08 Process xff09 当一个程序 进入内存运行时 xff0c 即变成一个进程 而一个线程中又包含多个进程 多线程的问