Java中的synchronized关键字的作用及其使用场景

目录

1. 互斥锁

2. 对象锁和类锁

3. 内存可见性

4. 锁升级

5. 总结


synchronized 是Java语言中用于实现线程同步的关键机制之一。它通过内置的锁机制来协调多线程对共享资源的访问,确保数据的一致性和完整性。

1. 互斥锁

  • 作用synchronized 提供了一种互斥锁机制,可以确保在同一时刻只有一个线程能够执行被保护的代码段或方法。这种机制有效地防止了多个线程同时修改同一资源导致的数据不一致问题。
  • 使用场景:在一个银行账户系统中,当多个用户尝试同时更新同一个账户余额时,使用 synchronized 可以确保每次只有一个用户的请求被处理,从而避免并发修改带来的错误。例如:
    public class BankAccount {
        private int balance;
        public void deposit(int amount) {
            synchronized (this) {
                balance += amount;
            }
        }
        public void withdraw(int amount) {
            synchronized (this) {
                balance -= amount;
            }
        }
    }
    

2. 对象锁和类锁

  • 作用synchronized 可以锁定对象实例(非静态方法或代码块)或整个类(静态方法)。对于普通方法或代码块,锁住的是调用该方法的对象实例;对于静态方法或静态代码块,锁住的是类的Class对象。
  • 使用场景:在电商平台的商品库存管理中,可以使用对象锁来控制对单个商品对象的访问,或者使用类锁来控制对整个库存列表的访问。例如:
    public class Product {
        private int stock;
        public synchronized void addStock(int quantity) {
            stock += quantity;
        }
        public synchronized void reduceStock(int quantity) {
            stock -= quantity;
        }
    }
    

3. 内存可见性

  • 作用synchronized 不仅提供了互斥访问,还保证了锁内操作对其他线程的可见性。这意味着当一个线程释放锁后,其对变量所做的修改会立即被其他获取该锁的线程看到。
  • 使用场景:在一个实时聊天应用中,当一个用户发送消息时,使用 synchronized 确保消息内容被及时更新并通知给所有在线用户。例如:
    public class ChatRoom {
        private List<String> messages = new ArrayList<>();
        public synchronized void sendMessage(String message) {
            messages.add(message);
        }
    }
    

4. 锁升级

  • 作用:在JVM中,synchronized 可能会经历从偏向锁、轻量级锁到重量级锁的升级过程。这种机制旨在提高性能,减少线程竞争带来的开销。
  • 使用场景:在高并发环境下,如大型在线游戏服务器,通过锁升级机制可以有效降低线程切换的成本,提高系统的吞吐量。例如:
    public class GameServer {
        private int playerCount;
        public synchronized void addPlayer() {
            playerCount++;
        }
        public synchronized void removePlayer() {
            playerCount--;
        }
    }
    

5. 总结

synchronized 关键字在Java中扮演着重要的角色,通过提供互斥锁、对象锁和类锁、内存可见性以及锁升级等功能,确保了多线程环境下的数据一致性和系统稳定性。当然,需要根据具体的应用场景选择合适的同步策略,可以有效地提升程序的性能和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大润发易主,被阿里割肉卖了

文丨白念云 零售行业2025年伊始便迎来一则重磅消息&#xff1a;大润发被卖了。 1月1日晚&#xff0c;阿里巴巴集团发布公告&#xff0c;宣布子公司及NewRetail与德弘资本达成交易&#xff0c;以最高约131.38亿港元出售所持高鑫零售&#xff08;大润发母公司&#xff09;全部股…

VulnHub—potato-suncs

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 hydr…

docker学习记录:commit,制作自己的镜像

1.清除所有 ktkt-SYS-4028GR-TR2:~$ sudo docker rm -f $(sudo docker ps -aq)2.再操作一次tomcat,修改好&#xff0c;再打成一外镜像 ktkt-SYS-4028GR-TR2:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat 9.0 3…

macos安装java8

下载 dmg方式安装 安装 双击pkg运行 输入java -version验证 配置环境变量 cd ~ ls -a输入 ls -a后查看是否已经存在.bash_profile文件&#xff0c;如果已经存在就不需要创建&#xff0c;如果不存在&#xff0c;继续执行下方命令创建文件 touch .bash_profile /usr/l…

【每日学点鸿蒙知识】自定义键盘光标、Cavas绘制、XComponent触发键盘抬起等

【每日学点鸿蒙知识】24.08.25 【每日学点鸿蒙知识】自定义键盘光标、Cavas绘制、XComponent触发键盘抬起等 1、基于自定义键盘如何设置光标位置&#xff1f; 可以参考如下代码&#xff1a; class MyKeyboardController {public onInputChanged?: (value: string) > vo…

在Mysql环境下对数据进行增删改查

一、插入数据&#xff1a; insert into 表名 [(字段名)] values (字段对应的值1,字段对应的值2,…)[,(字段对应的值1,字段对应的值2,…)]; insert into students (id,name,age,height,gender,cls_id,is_delete) values (0,小明,18,180.00,2,1,0)在学生表中插入“小明”数据的…

Web网页制作之JavaScript的应用

---------------&#x1f4e1;&#x1f50d;K学啦 更多学习资料&#x1f4d5; 免费获取--------------- 实现的功能&#xff1a;1.通过登录界面跳转至主页面&#xff0c;用户名统一为“admin”&#xff0c;密码统一为“admin123”&#xff0c;密码可显示或隐藏&#xff0c;输入…

Markdown编辑器——Typora(Picgo+Github图床)

Markdown编辑器——Typora&#xff08;PicgoGithub图床&#xff09; 文章目录 Markdown编辑器——Typora&#xff08;PicgoGithub图床&#xff09;安装Typora安装PicGoPicGo软件下载PicGo的npm版本下载 GitHub图床配置PicGo配置PicGo的软件配置PicGo的npm版本信息配置 配置Typo…

Unity 3D游戏开发从入门进阶到高级

本文精心整理了Unity3D游戏开发相关的学习资料&#xff0c;涵盖入门、进阶、性能优化、面试和书籍等多个维度&#xff0c;旨在为Unity开发者提供全方位、高含金量的学习指南.欢迎收藏。 学习社区 Unity3D开发者 这是一个专注于Unity引擎的开发者社区&#xff0c;汇聚了众多Un…

Python 21:Debug

1. Debug的作用 当程序的预期结果和实际结果不一致时&#xff0c;可以用Debug模式进行调试来定位问题的位置。 2. Debug使用 1&#xff09;设置断点 点击行号&#xff0c;出现”断点“ 2&#xff09;执行Debug 点击Debug 或者右键&#xff0c;点击debug进入debug模式 3.Debu…

(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布 **什么叫平滑&#xff1a;**在发布的过程中不影响用户的使用&#xff0c;系统不会因发布而暂停对外服务&#xff0c;不会造成用户短暂性无法访问&#xff1b; **什么叫灰度&#xff1a;**发布后让部分用户使用新版本&#xff0c;其它用户使用旧版本&am…

强化学习入门谈

之前我们见识到很多机器学习大展手脚的任务场景了&#xff0c;但是机器学习依旧有很多软肋。 回忆一下&#xff0c;我们之前做的机器学习&#xff08;深度学习&#xff09;策略基本都是类似于"supervised learning"的方法&#xff0c;比如你想用CNN实现一个classifi…

colnames看似简单,却能优化数据处理流程

引言 在数据处理和分析中&#xff0c;变量名称是至关重要的&#xff0c;它们决定了数据的可读性和操作的简便性。在R语言中&#xff0c;colnames 函数以其简单的语法设计&#xff0c;提供了高效管理数据框列名的能力&#xff0c;尤其是在复杂的爬虫任务中显得尤为重要。本篇文…

【分布式】Hadoop完全分布式的搭建(零基础)

Hadoop完全分布式的搭建 环境准备&#xff1a; &#xff08;1&#xff09;VMware Workstation Pro17&#xff08;其他也可&#xff09; &#xff08;2&#xff09;Centos7 &#xff08;3&#xff09;FinalShell &#xff08;一&#xff09;模型机配置 0****&#xff09;安…

ArcGIS中怎么把数据提取到指定范围(裁剪、掩膜提取)

最近&#xff0c;经常能收到怎么把数据提取到指定范围、栅格数据怎么裁剪、矢量数据怎么裁剪、栅格数据怎么掩膜提取的咨询。 下面是我对这个问题的解决思路&#xff1a; 对于矢量数据&#xff1a; ①首先把数据加载进来 ②软件界面上面的工具栏找到→地理处理→裁剪&#x…

intra-mart环境搭建笔记

一、前言 最近在做intra-mart项目&#xff0c;网上这些笔记比较少&#xff0c;在此做一下笔记。 intra-mart是由日本intra-mart公司开发和销售的工作流平台&#xff0c;国内确实不怎么用&#xff0c;日本企业用的多些&#xff0c;面试时会问有没有intra-mart经验。 这个自学…

智能型电瓶车充电桩在老居民区充电站中的应用优势

摘要 随着电瓶车数量的快速增长&#xff0c;小区内的电瓶车充电需求日益增加&#xff0c;但传统充电方式存在诸多安全隐患。电瓶车智能充电桩作为一种新型充电解决方案&#xff0c;能够有效解决充电难题&#xff0c;并提升充电安全性和便捷性。本文以ACX10A型电瓶车充电桩为…

生产看板真的有用吗?

​看板&#xff0c;对于从事制造行业的人员来说&#xff0c;这并不陌生。但是对于看板起到的作用&#xff0c;那可就是众说纷纭&#xff0c;有人说&#xff0c;看板是领导的“面子工程”&#xff0c;是混淆上级视察的工具&#xff1b;也有人说&#xff0c;看板真切地帮助车间提…

刷服务器固件

猫眼淘票票 大麦 一 H3C通用IP 注:算力服务器不需要存储 二 刷服务器固件 1 登录固定IP地址 2 升级BMC版本 注 虽然IP不一致但是步骤是一致的 3 此时服务器会出现断网现象&#xff0c;若不断网等上三分钟ping一下 4 重新登录 5 断电拔电源线重新登录查看是否登录成功

机器学习算法在推荐系统中的应用:从数据预处理到模型部署实战指南

机器学习算法在推荐系统中的应用&#xff1a;从数据预处理到模型部署实战指南 介绍 在当今信息爆炸的时代&#xff0c;推荐系统扮演了越来越重要的角色&#xff0c;它可以帮助用户发现和获取个性化的信息、产品或服务。而推荐系统中的机器学习算法则是其核心引擎&#xff0c;能…