并发编程--synchronized介绍

1.初步认识synchronized

先来看下利用 synchronized 实现 同步的基 Java 中的每一个 象都可以作 为锁 。具体表
以下 3 种形式。
        对于普通同步方法, 是当前 象。
        对于静 同步方法, 是当前 Class 象。
        对于同步方法 Synchonized 括号里配置的 象。
当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。
区别:
        当锁为Class对象时 ,同时被static修饰和synchronized修饰都不能被其他线程锁住调用,但是它们可以执行该类的synchronized修饰普通方法和没有synchronized修饰的方法
         当锁为实例对象时 ,只能锁住该实例修饰普通方法,对于其他实例的任何方法与当前实例( 除synchronized修饰的普通方法外 )都不起作用
         当锁同步方法块时, 括号里面是什么就对应锁住什么

2 JAVA的请求头

        synchronized用的 是存在 Java 里的。如果 象是数 组类 型, 机用 3 个字 宽 (Word )存 储对 ,如果 象是非数 组类 型, 2 储对 。在 32 位虚 机中, 1 宽 等于4 ,即 32bit ,如图 所示。

       
         Java对象 里的 Mark Word 里默 储对 象的 HashCode 、分代年 锁标记 位。 32 JVM 的Mark Word 的默 储结构如图 所示。

       
         在运行期间, Mark Word 里存 的数据会随着 锁标 志位的 化而 化。 Mark Word 可能 变 化为 以下 4种数据,如图 所示。

        在64 位虚 机下, Mark Word 64bit 大小的,其存 储结 构如表 2-5 所示

3.死锁

什么是死锁:

        死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。死锁是并发系统中的一种重要现象,它可能导致系统资源的浪费和进程的停滞。

例如:

        下面代码 t1 拿到 之后,因 一些异常情况没有 锁 (死循环 )。又或者是 t1 拿到一个数据 库锁 候抛出了异常,没 放掉。
public class DeadLockDemo {
privat static String A = "A";
private static String B = "B";
public static void main(String[] args) {new DeadLockDemo().deadLock();
}
private void deadLock() {Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (A) {try { Thread.currentThread().sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (B) {System.out.println("1");}}}
});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (B) {synchronized (A) {System.out.println("2");}}}});t1.start();t2.start();}
}

死锁产生的四个条件

        1.互斥条件:指同一资源不能被多个线程访问

        2.持有并等待条件:指当前线程已经持有一个资源,又去申请另外一个,但此时另外的这个资源被别人已经占用了,当前线程只能处于等待状态

        3. 不可剥夺条件:当当前线程已经持有了某个资源,只有自己使用完才能将资源释放

        4.环形等待条件:当前的几个线程都占用了不同的资源,但是又需要别的线程占用的资源才能使用完并释放锁 

    

解决死锁的四种方式

        1. 破坏互斥条件:能允许同一资源被多线程访问

        2. 破坏持有并等待条件:保证当前线程执行时能获取到所有资源,否则不可以执行继续等待

        3. 破坏不可剥夺条件:当某个线程一直占用某个资源时,强制剥夺他的资源给别的线程

        4. 破坏环形等待条件:对待需要资源排序,要求每个线程按照顺序获取资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-首字母移位(PythonTip)

[题目描述] 编写一个程序,将句子中每个单词的首字母移位到下一个单词。定义函数shift_first_letter(),参数为sentence(字符串)。在函数内,将句子中每个单词的首字母移位到下一个单词。最后一个单词的首字母移位到句子的…

SQL 注入漏洞详解 - Union 注入

1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,…

记录|C#+winform创建扁平化风格界面

本项目的C#内容是自己跟做的,自己做的内容已经打包,可以通过自己跟做写的Dashboard界面,C#下的winform模式下载获得,但是需要花费3个积分 目录 前言一、左边设置和步骤界面步骤Step1.Step2.Step3.Step4Step5 二、右边属性和步骤属…

【BUG】已解决:ModuleNotFoundError: No module named ‘requests‘

ModuleNotFoundError: No module named ‘requests‘ 目录 ModuleNotFoundError: No module named ‘requests‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身&a…

Python怎样读取URL生成PDF

1. 安装依赖的exe 需要在这个网址,安装一个exe包,地址:https://wkhtmltopdf.org/ 进入网址后,点这个位置: 选择一个你的操作系统的下载链接: 安装后的exe文件: C:\Program Files\wkhtmltopdf…

记录解决springboot项目上传图片到本地,在html里不能回显的问题

项目场景: 项目场景:在我的博客系统里:有个相册模块:需要把图片上传到项目里,在html页面上显示 解决方案 1.建一个文件夹 例如在windows系统下。可以在项目根目录下建个photos文件夹,把上传的图片文件…

华为OD2024D卷机试题汇总,含D量50%+,按算法分类刷题,事半功倍

目录 专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢? 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

SAP 贷项销售订单简介

SAP 贷项销售订单简介 1. 什么是销售贷方销售订单?2. 创建销售贷方销售订单的场景3. 销售贷方销售订单的创建流程直接创建发票---VF01将会计凭证过账到会计核算查看贷项销售订单凭证流查看客户明细---FBL5N贷项后台配置SAP销售贷方销售订单(Sales Credit Memo Request)是销售…

Windows定时任务实现关闭和开启声音

目录 1. 下载并放置 nircmd.exe1.1 下载 NirCmd:1.2 放置 nircmd.exe: 2. 定时关闭声音2.1 打开任务计划程序:2.2 创建基本任务:2.3 设置任务名称和描述:2.4 触发器:2.5 操作:2.6 设置程序或脚本…

面试官问:Django、Flask、FastAPI,你选哪个?为什么?

如果你是python Web方向的开发工程师,那么在面试中,会经常遇到面试官问这个问题: “在Python的三个流行Web框架:Django、Flask和FastAPI,说说它们的异同,以及你是怎么选择合适的框架?” 异同对…

AndroidStudio 编辑xml布局文件卡死问题解决

之前项目编写的都是正常,升级AndroidStudio后编辑布局文件就卡死,还以为是AndroidStudio文件。 其实不然,我给整个项目增加了版权声明。所以全部跟新后,布局文件也增加了版权声明。估计AndroidStudio在 解析布局文件时候因为有版…

【目标检测】Anaconda+PyTorch(GPU)+PyCharm(Yolo5)配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch、PyCharm、Yolov5关键步骤安装,为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程,为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网:https://www.anaconda…

ubuntu源码安装Odoo

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo具有非常多的安装方式,除了我最爱用的 apt-get install,我们还可以使用git拉取Odoo源码进行安装。 本次示例于ubuntu20.04 Desktop上进行操作,理论上在ubuntu14.04之后都可以用此操作。 …

OpenWrt 配置 Tailscale 内网穿透

前言 Openwrt 安装 zerotier 内网穿透. Tailscale 在 OpenWrt 下配置教程参考 GXNAS 博客 的 OpenWrt安装Tailscale设置内网穿透科学出国外网互访局域网设备。啥都不会难搞 的 【傻呱呱】OpenWrt安装Tailscale。阿髙 的 openwrt设置开机自启 tailscale为例。 Tailscale 安…

【算法】一致性哈希

一、引言 在分布式系统中,数据存储和访问的均匀性、高可用性以及可扩展性一直是核心问题。一致性哈希算法(Consistent Hashing)是一种分布式算法,因其出色的分布式数据存储特性,被广泛应用于缓存、负载均衡、数据库分片…

在浏览器中测试JavaScript代码方法简要介绍

在浏览器中测试JavaScript代码方法简要介绍 在浏览器中测试JavaScript代码是前端开发中的一个重要技能。方法如下: 1. 浏览器控制台 最简单和直接的方法是使用浏览器的开发者工具中的控制台(Console)。 步骤: 在大多数浏览器…

iOS ------ weak的基本原理

1.weak的基本概念 weak弱引用,所引用的对象的引用计数不会加一,引用对象被释放的时候会自动设置为nil多用于解决对象间的相互引用造成内存泄露的循环引用的问题 2.实现原理 Person *object [[Person alloc] init]; id __weak objc object;Runtime维…

Redis 7.x 系列【26】集群模式动态扩容、动态缩容

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 动态扩容1.1 安装、启动1.2 加入新节点1.3 分配哈希槽1.4 加入从节点 2. 缩容2.1 删…

护眼灯和普通台灯有什么区别?解密护眼灯行业常见的四大选购套路

护眼灯和普通台灯有什么区别?随着护眼台灯的普及,市场上涌现了许多新兴品牌。然而,并非所有品牌都具备专业的技术研发实力。因此,网络上关于护眼台灯的各种问题也日益增多,如耐磨性差、耐高温性不足,甚至可…

python实现图像缩放算法

图像缩放算法 1.最近邻插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点2.双线性插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点3.双三次插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点 1.最近邻插值图像缩放算法详解 最近邻插值(Near…