synchronized 锁的到底是什么?

 通过8种情况演示锁运行案例,看看我们到底锁的是什么


1锁相关的8种案例演示code

package com.bilibili.juc.lock;import java.util.concurrent.TimeUnit;/*** 题目:谈谈你对多线程锁的理解,8锁案例说明* 口诀:线程 操作 资源类* 8锁案例说明:* 1. 标准访问ab两个线程,请问先打印邮件还是短信? --------先邮件,后短信  共用一个对象锁* 2. sendEmail钟加入暂停3秒钟,请问先打印邮件还是短信?--------先邮件,后短信  共用一个对象锁* 3. 添加一个普通的hello方法,请问先打印普通方法还是邮件? --------先hello,再邮件  资源没有争抢,hello方法没有用到对象锁* 4. 有两部手机,请问先打印邮件还是短信? --------先短信后邮件  资源没有争抢,不是同一个对象锁* 5. 有两个静态同步方法,一部手机, 请问先打印邮件还是短信?--------先邮件后短信  共用一个类锁* 6. 有两个静态同步方法,两部手机, 请问先打印邮件还是短信? --------先邮件后短信  共用一个类锁* 7. 有一个静态同步方法,一个普通同步方法,一部手机,请问先打印邮件还是短信? --------先短信后邮件  一个类锁一个对象锁* 8. 有一个静态同步方法,一个普通同步方法,两部手机,请问先打印邮件还是短信? ---------先短信后邮件  一个类锁一个对象锁*/
public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();Phone phone2 = new Phone();new Thread(() -> phone.sendEmail(), "a").start();// 暂停200毫秒,保证线程先启动try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> /*phone.sendSMS()*/ /*phone.hello()*/ phone2.sendSMS(), "b").start();}}// 资源类
class Phone {public static synchronized void sendEmail() {try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("--------sendEmail--------");}public /*static*/ synchronized void sendSMS() {System.out.println("--------sendSMS--------");}public void hello() {System.out.println("--------hello--------");}
}

2案例总结


1-2:

一个对象里面如果有多个 synchronized 方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法,其它线程都只能等待。换句话说,某一个时刻内,只能有唯一的一个线程去访问这些synchronized方法。锁的是当前对象this,被锁定后,其它线程都不能进入到当前对象的其它的synchronized方法

3-4:

加个普通方法后发现和同步锁无关

换成两个对象后,不是同一把锁了,情况立即变化

5-6:

都换成静态同步方法后,情况又变化

三种synchronized锁的内容有一些差别:

对于普通同步方法(被synchronized修饰的成员方法),锁的是当前实例对象,通常指this,所有的同步方法用的都是同一把锁—>实例对象本身(即Phone phone = new Phone();)
对于静态同步方法(被synchronized修饰的静态方法),锁的是当前类的Class对象,即Phone.class唯一的一个模板
对于同步方法块,锁的是synchronized括号内的对象

7-8:

当一个线程试图访问同步代码时,它首先必须得到锁,正常退出或抛出异常时必须释放锁

所有的普通同步方法用的都是同一把锁——实例对象本身,就是new出来的具体实例对象本身,本类this。也就是说如果一个实例对象的普通同步方法获取锁后,该实例对象的其它普通同步方法必须等待获取锁的方法释放锁后才能获取锁

所有的静态方法用的也是同一把锁——类对象本身,就是我们说过的唯一模板class。具体实例对象this和唯一模板class,这两把锁是两个不同的对象,所以静态同步方法和普通同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,其它的静态同步方法都必须等待该方法释放锁后才能获取锁

如图中Car Class就是模板,存放在虚拟机中的方法区/元空间,Car Class这个模板就只有一份。但是Car的实例对象,如:car1、car2、car3都在堆内存中,可以有多个。所以说Car Class和car实例加锁的地方和对象都不一样。运行效果也不一样。

  • 作用于实例方法,当前实例加锁,进入同步代码块前要获得当前实例的锁;
  • 作用于代码块,对括号里配置的对象加锁
  • 作用于静态方法,当前类加锁,进去同步代码前要获得当前类对象的锁

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

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

相关文章

CLIP--Learning Transferable Visual Models From Natural Language Supervision

参考:CLIP论文笔记--《Learning Transferable Visual Models From Natural Language Supervision》_visual n-grams模型-CSDN博客 openAI,2021,将图片和文字联系在一起,----->得到一个能非常好表达图片和文字的模型主题&#…

Pandas 使用 concat 数据合并你学会了吗?

1. 使用pd.concat()级联 pandas使用pd.concat函数,与np.concatenate函数类似 # 导包import numpy as npimport pandas as pd​# 为方便讲解,我们首先定义一个生成DataFrame的函数def make_df(indexs,columns): data [[str(j)str(i) for j in colum…

RabbitMQ延时队列

一、RabbitMQ下载并使用插件 1、查看RabbitMQ插件的文件路径 docker inspect rabbitmq 找到Mounts下面Name:rabbitmq_plugin的Source即为插件路径 使用 cd 进入到该目录 2、下载插件 wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download…

C# 使用Aspose生成和修改文档

Aspose库 C#中的Aspose库是一个强大的文件处理库,可以用于各种文件格式的创建、编辑、转换和操作。该库提供了丰富的功能,包括处理文档、电子表格、幻灯片、PDF、图像等多种文件格式,能够轻松实现文件的读取、写入、格式化、样式设置、数据操…

Java Apache Jaccard文本相似度匹配初体验

文章目录 前言一、文本相似度算法的选择二、常见的文本相似度算法介绍三、使用示例1、引入jar包2、方法示例3、Jaccard源码剖析4、Jaccard源码解释 写在最后 前言 产品今天提了个需求,大概是这样的,来,请看大屏幕。。。额。。。搞错了&#…

三丰云评测:免费虚拟主机和免费云服务器体验

今天我来为大家分享一下我的三丰云评测体验。三丰云是一家提供免费虚拟主机和免费云服务器的服务商,为了方便大家了解他们的服务,我特地注册了他们的免费虚拟主机和免费云服务器进行试用。在实际体验中,我发现三丰云的服务表现非常出色。首先…

【产品经理】总篇章

引言: 在最近频繁的产品职位面试中,我深刻体会到了作为产品需要的不仅仅是对市场和技术的敏锐洞察,更多的是在复杂多变的环境中,如何运用沟通、领导力和决策能力来引导产品从概念走向市场。这一系列博客将分享我多年经历和所学到的所以知识&a…

OpenCV学习 基础图像操作(十六):图像距离变换

基础原理 顾名思义,我们可以利用像素之间的距离作为对该像素的一种刻画,并将其运用到相应的计算之中。然而,在一幅图像之中,某种类型的像素并不是唯一的,因此我门常计算的是一类像素到另一类的最小距离,并…

工厂模式详情

一.介绍工厂模式的用途与特点 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例…

npm install node-sass 安装失败的解决方案:利用国内镜像加速安装

在开发前端项目时,使用Sass作为CSS预处理器是很多开发者的选择。然而,在通过npm安装其Node.js绑定库node-sass时,一些开发者可能会遇到安装失败的问题,尤其是网络原因导致的下载缓慢或中断。本文将指导你如何通过更换为国内镜像源…

如何在测试/线上环境页面访问本地接口?

文章目录 一、前言二、分析三、搭建1、搭建nginx,监听http请求转发2、监听https请求转发 四、总结 一、前言 在工作中,开发完的接口,一般测试的话,基本是使用Postman,如果要到页面测试,就要发版进行测试&a…

《逆水寒》手游周年庆,热度不减反增引发热议

易采游戏网5月31日最新消息:随着数字娱乐时代的飞速发展,手游市场的竞争愈发激烈。在这样的大背景下,《逆水寒》手游以其独特的古风武侠世界和深度的社交体验,自上线以来便吸引了无数玩家的目光。如今,这款游戏迎来了它…

知识运维概述

文章目录 知识运维研究现状技术发展趋势 知识运维 由于构建全量的行业知识图谱成本很高,在真实的场景落地过程中,一般遵循小步快走、快速迭代的原则进行知识图谱的构建和逐步演化。知识运维是指在知识图谱初次构建完成之后,根据用户的使用反馈…

WSL2-Ubuntu22.04-配置

WSL2-Ubuntu22.04-配置 准备1. WSL相关命令[^1]2. WSL2-Ubuntu22.04可视化3. WSL2 设置 CUDA4. 设置OpenGL 本文介绍了WSL2的基本使用方法及可视化,着重介绍了GPU和OpenGL的设置。 准备 名称版本windows11wsl2CUDA12.5 1. WSL相关命令1 查看已安装的wsl distribut…

DevExpress开发WPF应用实现对话框总结

说明: 完整代码Github​(https://github.com/VinciYan/DXMessageBoxDemos.git)DevExpree v23.2.4(链接:https://pan.baidu.com/s/1eGWwCKAr8lJ_PBWZ_R6SkQ?pwd9jwc 提取码:9jwc)使用Visual St…

“手撕”链表的九道OJ习题

目录 1. 第一题 2. 第二题 3. 第三题 4. 第四题 5. 第五题 6. 第六题 7. 第七题 8. 第八题 9. 第九题 1. 第一题 删除链表中等于给定值 val 的所有节点。OJ链接 思路如下: 相当于链表的removeAll();制定prev和cur,prev记录前一个节点&#xff…

2021JSP普及组第三题:插入排序

2021JSP普及组第三题 题目: 思路: 题目要求排序后根据操作进行对应操作。 操作一需要显示某位置数据排序后的位置,所以需要定义结构体数组储存原数据的位置和数据本身排序后所得数据要根据原位置输出排序后的位置,所以建立一个新…

作业 递归应用

已完成&#xff1a;7 #include <iostream> using namespace std; long long f(long long,long long); int main(){long long n,m;cin>>n>>m;cout<<f(m,n);return 0; } long long f(long long a,long long b){if(a%b0){return b;}return f(b,a%b); } #i…

RedisSearch与Elasticsearch:技术对比与选择指南

码到三十五 &#xff1a; 个人主页 数据时代&#xff0c;全文搜索已经成为许多应用程序中不可或缺的一部分。RedisSearch和Elasticsearch是两个流行的搜索解决方案&#xff0c;它们各自具有独特的特点和优势。本文简单探讨一些RedisSearch和Elasticsearch之间的技术差异。 目录…

软件测试基础

目录 一.基础 1.概念 1.1 什么是软件测试&#xff1f; 1.2 什么是需求&#xff1f; 1.3 什么是测试用例&#xff1f; 1.4 为什么需要测试用例&#xff1f; 1.5 什么是BUG&#xff1f; 1.6 软件生命周期 2.开发模型 2.1 瀑布模型 2.2 螺旋模型 2.3 增量模型、迭代模型…