[JAVAee]synchronized关键字
目录
1.synchronized的特性
①互斥性
②可重入性
2.synchronized的使用示例
①修饰普通方法
②修饰静态方法
③修饰代码块
1.synchronized的特性
①互斥性
互斥性,就像是给门上锁了一样.
当A线程使用了被synchronized修饰的代码块并对其上锁,其他线程(B线程,C线程)想要使用这个代码块的时候就会调整为阻塞的状态.
当A线程执行完这个被synchronized修饰的代码块后,跳出这个代码块.此时,相当于解锁.
在解锁后,B线程与C线程就可以通过被随机调度来使用这个代码块.(因为线程间的调度是随机的,B,C线程都想要使用这个代码块,但是并不会遵循先来后到的顺序.在A使用的时候,他们都为阻塞状态.是会被操作系统在B,C中随机唤醒一个来使用)
②可重入性
被synchronized修饰就像被上锁了一样,有着可重入性这一特征.也被称为可重入锁,而可重入锁也可以叫做递归锁.
什么是可重入性呢?就是在线程A进入被synchronized修饰的代码块后,代码块中可能又调用了这个同一个方法(像是递归).此时代码块是上锁的状态,但因为synchronized是可重入性的锁.在检测到再次进入这个代码块的线程和之前对其上锁的线程是同一个的时候.就可以再次进入此代码块.
2.synchronized的使用示例
synchronized 本质上要修改指定对象的 "对象头". 从使用角度来看, synchronized 也势必要搭配一个具体的对象来使用.
被synchronized修饰的代码块,也被称为"同步代码块"
①修饰普通方法
此处ListNode类上的valAdd方法被synchronized修饰,当任意线程调用到这个方法的时候,被上锁的其实是使用这个方法的实例对象.
像是此处,线程0与线程1都分别调用了listNode0这个实例对象,再调用到valAdd方法.所以被上锁的其实是listnode0这个对象,此时的listnode0对象的属性与方法都是不可被其他线程调用的.
class ListNode{int val;ListNode next;public ListNode(int val){this.val = val;}public synchronized void valAdd(ListNode cur){//被synchronized修饰的普通方法cur.val = cur.val + 1;}
}public class Test4 {public static void main(String[] args) throws InterruptedException {ListNode listNode0 = new ListNode(0);Thread thread0 = new Thread(() -> {listNode0.valAdd(listNode0);});Thread thread1 = new Thread(() -> {listNode0.valAdd(listNode0);});thread0.start();thread1.start();thread0.join();thread1.join();System.out.println(listNode0.val);}
}
②修饰静态方法
当synchronized修饰的是一个类方法时,被上锁的其实是Test4这个类对象.但他的上锁范围只有被synchronized修饰的类方法,其他没有被synchronized修饰的类方法是可以被其他线程调用的.
public class Test4 {static int n = 0;public static synchronized void add(){n = n + 1;}public static void main(String[] args) throws InterruptedException {Thread thread0 = new Thread(() -> {add();});}
}
public class Test4 {static int n = 0;public static synchronized void add(){n = n + 1;}public static void ADD(){//像这里,没有被synchronized修饰的类方法,其他线程也可以访问到n = n + 1;}public static void main(String[] args) throws InterruptedException {Thread thread0 = new Thread(() -> {for(int i = 0; i < 10000;i++){add();}});Thread thread1 = new Thread(() -> {for(int i = 0; i < 10000;i++){ADD();}});thread0.start();thread1.start();thread0.join();thread1.join();System.out.println(n);}
}
这个n != 20000的结果也证明了这个观点

③修饰代码块
synchronized修饰一个代码块,括号里的是要被上锁的对象.即哪一个对象调用了这个方法并进入了这个代码块,哪一个对象就会被上锁
public synchronized void add(){synchronized (this){n = n + 1;}}
这里就是进入此代码块,就会将指定的类对象上锁.
public synchronized void add(){synchronized (Test4.class){n = n + 1;}}
使用synchronized的时候,首先要明白的是被上锁的对象是什么.只有线程间想给同一个对象上锁的时候才会造成线程的阻塞.
如果两个线程要给不同的对象上锁,他们是不会产生阻塞等待的.
相关文章:
[JAVAee]synchronized关键字
目录 1.synchronized的特性 ①互斥性 ②可重入性 2.synchronized的使用示例 ①修饰普通方法 ②修饰静态方法 ③修饰代码块 1.synchronized的特性 ①互斥性 互斥性,就像是给门上锁了一样. 当A线程使用了被synchronized修饰的代码块并对其上锁,其他线程(B线程,C线程)想要使…...
Unity游戏源码分享-3d机器人推箱子游戏
Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏 工程地址:https://download.csdn.net/download/Highning0007/88098014...
SAAS部署模式
SAAS(Software as a Service)顾名思义,软件即服务的产品。 常见部署模式: 公有云:SAAS产品部署在公有云平台上,由SAAS提供商管理整个基础架构和应用程序。客户通过互联网访问和使用SAAS产品,无…...
11、PHP面向对象1
1、PHP的面向对象与其他语言类似,但也有不同。 PHP访问成员变量时,需要用“->”,而不能用“.”,访问成员函数时,需要用“->”,而不能用“.”。操作符“::”可以在没有任何声明实例的情况下访问类中的…...
实训笔记7.25
实训笔记7.25 7.25笔记一、MapReduce的特殊使用场景1.1 通过MapReduce程序实现多文件Join操作1.1.1 通过在Reduce端实现join操作1.1.2 通过在Map端实现join操作 1.2 MapReduce中的计数器的使用1.2.1 计数器使用两种方式 1.3 MapReduce实现数据清洗 二、MapReduce的OutputFormat…...
全方位对比 Postgres 和 MongoDB (2023 版)
本文为「数据库全方位对比系列」第二篇,该系列的首部作品为「全方位对比 Postgres 和 MySQL (2023 版)」 为何对比 Postgres 和 MongoDB 根据 2023 年 Stack Overflow 调研,Postgres 已经成为最受欢迎和渴望的数据库了。 MongoDB 曾连续 4 年 (2017 - …...
本地部署中文LLaMA模型实战教程,民间羊驼模型
羊驼实战系列索引 博文1:本地部署中文LLaMA模型实战教程,民间羊驼模型(本博客) 博文2:本地训练中文LLaMA模型实战教程,民间羊驼模型 博文3:精调训练中文LLaMA模型实战教程,民间羊驼模型 简介 LLaMA大部分是英文语料训练的,讲中文能力很弱。如果我们想微调训练自己的…...
全志F1C200S嵌入式驱动开发(spi-nor image制作)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 一般soc系统里面添加spi-nor flash芯片,特别是对linux soc来说,都是把它当成文件系统来使用的。spi-nor flash和spi-nand flash相比,虽然空间小了点,但是胜在稳定,这是很多工业…...
JSON格式Python,Java,PHP等封装图片识别商品数据API方法
淘宝是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取淘宝天猫图片识别商品数据,您可以通过开放平台的接口或者直接访问淘宝天猫商城的网页来获取图片识别商品数据。以下是两种常用方法的介绍&#…...
Vue应用案例
项目一:记事本 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8" /><title>title</title></head> <body><div id"app"><h2 >记事本</h2><input …...
GPT-3.5:ChatGPT的奇妙之处和革命性进步
🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~ἳ…...
【Hadoop 01】简介
目录 1 Hadoop 简介 2 下载并配置Hadoop 2.1 修改/etc/profile 2.2 修改hadoop-env.sh 2.3 修改core-site.xml 2.4 修改hdfs-site.xml 2.5 修改mapred-site.xml 2.6 修改yarn-site.xml 2.7 修改workers 2.8 修改start-dfs.sh、stop-dfs.sh 2.9 修改start-yarn.sh、s…...
【C++】开源:跨平台轻量日志库easyloggingpp
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍跨平台轻量日志库easyloggingpp。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&am…...
spring-websocket在SpringBoot(包含SpringSecurity)项目中的导入
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 🥭本文内容:spring-websocket在SpringBoot(包含SpringSecurity…...
SpringBoot + Vue前后端分离项目实战 || 六:Jwt加密整合配置
文章目录 回顾添加依赖Jwt依赖Jwt配置定义Jwt拦截器注册Jwt拦截器,配置需要验证token的URL 测试Jwt修改登录等逻辑 回顾 在之前的系统中,我们利用UUID配合Redis以达到角色登录的功能。 当前整个系统存在一个问题:人为修改token值后…...
WPF 如何设置全局的订阅发布事件
文章目录 前言代码逻辑修改 总结 前言 我们需要一个全局事件订阅发布功能,实现页面通讯。使两个毫无关系的页面通过一个中间量进行通讯。 代码 IEventAggregator:消息订阅集合 这个是Prism提供的消息订阅功能。使用如下 设置订阅类型,即…...
STM32 USB使用记录:HID类设备(前篇)
文章目录 目的基础说明HID类演示代码分析总结 目的 USB是目前最流行的接口,现在很多个人用的电子设备也都是USB设备。目前大多数单片机都有USB接口,使用USB接口作为HID类设备来使用是非常常用的,比如USB鼠标、键盘都是这一类。这篇文章将简单…...
探索AI图像安全,助力可信AI发展
探索AI图像安全,助力可信AI发展 0. 前言1. 人工智能发展与安全挑战1.1 人工智能及其发展1.2 人工智能安全挑战 2. WAIC 2023 多模态基础大模型的可信 AI2.1 WAIC 2023 专题论坛2.2 走进合合信息 3. AI 图像安全3.1 图像篡改检测3.2 生成式图像鉴别3.3 OCR 对抗攻击技…...
vue 学习笔记 【ElementPlus】el-menu 折叠后图标不见了
项目当前版本 {"dependencies": {"element-plus/icons-vue": "^2.1.0","types/js-cookie": "^3.0.3","types/nprogress": "^0.2.0","axios": "^1.4.0","core-js": &quo…...
【JavaEE初阶】HTTP协议
文章目录 1. HTTP概述和fiddler的使用1.1 HTTP是什么1.2 抓包工具fiddler的使用1.2.1 注意事项1.2.2 fiddler的使用 2. HTTP协议格式2.1 HTTP请求格式2.1.1 基本格式2.1.2 认识URL2.1.3 方法 2.2 请求报头关键字段2.3 HTTP响应格式2.3.1 基本格式2.3.2状态码 1. HTTP概述和fidd…...
从时频分析到信号净化:小波变换的降噪实战指南
1. 小波变换基础:从傅里叶到时频分析 第一次接触小波变换时,我和大多数工程师一样,脑子里全是傅里叶变换的影子。记得当时处理一组振动传感器数据,傅里叶变换告诉我信号里存在30Hz和50Hz的成分,但就是找不到这些频率具…...
嵌入式软件开发规范与最佳实践指南
嵌入式软件开发最佳实践指南1. 项目概述1.1 嵌入式开发核心挑战现代嵌入式系统开发面临代码复杂度增加、团队协作需求提升以及产品迭代周期缩短等多重挑战。高效的开发流程和规范的编码实践成为保证项目成功的关键因素。1.2 开发环境配置建议推荐采用以下硬件配置方案ÿ…...
机器视觉中的坐标系转换:从像素到世界的无缝衔接
1. 机器视觉中的坐标系基础概念 第一次接触机器视觉时,最让我困惑的就是各种坐标系之间的关系。记得当时调试工业相机时,明明在图像上看到了目标物体,但机械臂就是抓不准位置。后来才发现,问题出在没有正确理解像素坐标系和世界坐…...
EB Tresos里XDM文件详解:不只是配置界面,更是你定制MCAL模块的‘源代码’
EB Tresos中XDM文件的深度解析:从配置界面到MCAL模块定制化开发 在AUTOSAR开发领域,EB Tresos Studio作为行业标准的MCAL配置工具,其核心机制往往隐藏在那些看似普通的配置文件中。XDM文件就是这样一个关键角色——它远不止是配置界面的数据源…...
YOLOv5 vs YOLOv8:2024年工业部署选型指南(附实测对比)
YOLOv5 vs YOLOv8:2024年工业部署选型指南(附实测对比) 在工业视觉检测领域,目标检测模型的选型直接关系到产线良率、运维成本和系统响应速度。作为YOLO系列当前最成熟的工业级解决方案,YOLOv5和YOLOv8的抉择让不少工程…...
Logisim-evolution完全指南:跨平台安装与配置实战
Logisim-evolution完全指南:跨平台安装与配置实战 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 准备阶段:从零开始的环境搭建 1.1 认识Logisim…...
GitHub 热榜项目 - 日榜(2026-03-25)
GitHub 热榜项目 - 日榜(2026-03-25) 生成于:2026-03-25 统计摘要 共发现热门项目: 14 个 榜单类型:日榜 本期热点趋势总结 本期 GitHub 热榜呈现出 AI Agent(智能体)从通用化向垂直领域深耕的显著趋势。技术核心…...
2025年项目管理工具深度评测:Gitee如何引领技术团队协作新范式
随着数字化转型进入深水区,项目管理工具正从简单的任务管理平台进化为企业数字化转型的核心枢纽。在2025年最新发布的《全球项目管理工具评测报告》中,Gitee凭借其独特的"开发协作"一体化设计,成为中国技术团队的首选平台。本文将深…...
CAN总线大数据传输的解决方案
CAN总线通讯最多传输8个字节,如果需要传输大量数据该怎么办呢?这个问题工业界有很多成熟的解决方案,我现在就来详细为你介绍各种处理方法。 一、CAN协议的限制原因 CAN帧的数据场限制为8字节,主要是为了保证: • 实时性…...
ollama-QwQ-32B中文优化:提升OpenClaw处理本地文档的准确率
ollama-QwQ-32B中文优化:提升OpenClaw处理本地文档的准确率 1. 为什么需要专门优化中文文档处理 去年我在用OpenClaw处理公司合同时,发现一个尴尬现象:同样的合同解析任务,英文版能准确提取条款和日期,中文版却频繁出…...
