synchronized 与 Lock 的区别

synchronized 与 Lock 的区别

    • 1、相同点
    • 2、不同点
      • 2.1 精确性与灵活性
      • 2.2 性能
      • 2.3 使用便利性
    • 3、示例
      • 3.1 synchronized 示例
      • 3.2 Lock 示例
    • 4、总结


💖The Begin💖点点关注,收藏不迷路💖

在Java多线程编程中,synchronizedLock都扮演着确保线程安全访问共享资源的重要角色,但它们之间存在一些关键的区别。

1、相同点

  • 功能相同:两者都能有效防止多个线程同时访问共享资源导致的数据不一致问题。

2、不同点

2.1 精确性与灵活性

  • synchronized

    • 自动管理锁的获取和释放,简化了编程模型。
    • 但缺乏灵活性,无法精细控制锁的获取和释放时机。
  • Lock

    • 需要显式地调用lock()unlock()方法来获取和释放锁。
    • 提供了更高的灵活性和精确性,允许程序员根据实际需求进行更细致的控制。

2.2 性能

  • synchronized

    • 在JDK 1.6及以后版本中,通过锁优化技术(如锁粗化、锁消除、轻量级锁和偏向锁)提高了性能。
    • 但对于某些复杂场景,可能仍不是最优选择。
  • Lock

    • 通过不同的锁实现(如ReentrantLock)和优化技术,可能获得更好的性能。
    • 支持公平锁和非公平锁,以及尝试非阻塞地获取锁等高级功能。

2.3 使用便利性

  • synchronized

    • 使用简单,只需在方法或代码块前加上synchronized关键字即可。
    • 但对于复杂的同步逻辑,可能会显得力不从心。
  • Lock

    • 使用相对复杂,需要显式地编写获取和释放锁的代码。
    • 但提供了更多的控制选项和灵活性,适用于复杂的同步场景。

3、示例

3.1 synchronized 示例

public class CounterSync {  private int count = 0;  public synchronized void increment() {  count++;  }  
}  

3.2 Lock 示例

import java.util.concurrent.locks.Lock;  
import java.util.concurrent.locks.ReentrantLock;  public class CounterLock {  private final Lock lock = new ReentrantLock();  private int count = 0;  public void increment() {  lock.lock();  try {  count++;  } finally {  lock.unlock();  }  }  
}

4、总结

1、对于简单的同步需求,推荐使用synchronized,因为它简洁且易于使用。

2、对于需要更高灵活性和精确控制的复杂同步场景,Lock是更好的选择。
在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

智能家居沙盘系统-智慧家居沙盘系统

智能家居和物联网技术是当前科技领域的热门话题,随着各类智能家居产品的不断推出,智能家居市场也逐渐呈现出蓬勃发展的态势。智能家居快速发展,而物联网相关人才供应远远不足。高校开展智能家居工程及设计人才教育培养具有重大意义。 基本介绍…

【stm32】EXTI外部中断

EXTI外部中断 1、中断系统2、中断执行流程3、STM32中断4、NVIC基本结构5、NVIC优先级分组6、EXTI简介(引脚电平变化,申请中断)7、EXTI基本结构8、AFIO复用IO口9、EXTI框图10、旋转编码器简介11、程序设计:1.使用对射式红外传感器触…

vue3实现商品图片放大镜效果(芋道源码yudao-cloud 二开笔记)

今天开发一个防某商城的商品图片放大镜,鼠标移动到图片位置时,右侧出现一个已放大的图片效果。 示例如下: 下图的图片的放大效果和小图的切换封装成了组件PicShow.vue,可根据需求自行修改,如下: 第一步&…

Html5总结

前端学习 html决定页面的结构css决定页面的样式js决定页面的行为 Html5 1.文本格式化标签(熟记) 你在网页中,有时需要为文字设置粗体、斜体或下划线效果,这时就需要用到HTML中的文本格式化标记 2.标签属性 例如: …

算法 —— 位运算

目录 位运算常用结论 位运算例题 位1的个数 比特位计算 汉明距离 只出现一次的数字 判定字符是否唯一 丢失的数字 两整数之和 消失的两个数字 进制转换 位运算常用结论 想详细了解位运算的内容可以阅读我的这篇博客:应该背下的位运算 以下我只介绍一些位…

3.特征工程-特征抽取、特征预处理、特征降维

文章目录 环境配置(必看)头文件引用1.数据集: sklearn代码运行结果 2.字典特征抽取: DictVectorizer代码运行结果稀疏矩阵 3.文本特征抽取(英文文本): CountVectorizer()代码运行结果 4.中文文本分词(中文文本特征抽取使用)代码运行结果 5.中文文本特征抽…

Linux基础笔记分享(超详细~)

文章目录 Linux基础1.基础概念2.基础命令命令行快捷键自动补全: tab移动光标快速删除翻看历史命令终止程序退出登录清屏 查看命令帮助alias命令别名-快捷键pwd-类似于地图cd-类似于传送术mkdir-类似于合成装备touch-创建文件ls-类似于查看装备tree-打印目录层级结构cp-复制命令…

HarmonyOS 习题(一)

1、在HarmonyOS系统架构中,以下哪项属于应用层? A)AI子系统 B)U框架 C)电话 D)内核 答案:C 解析: 2、在HarmonyOS系统架构中,以下哪项提供统一的外设访问能力和驱动的开发管理框架…

sqli-labs靶场练习(1、5-8关)

自己搭建环境啊喂...http://127.0.0.1/sqli-labs-php7-master/ 第一关 1.单引号判断是否存在注入点 /?id1 2.查询列数 ?id1 order by 3-- ?id1 order by 4-- 由此可判断有3列 3.查询用户名和密码分别在哪列 ?id-1 union select 1,2,3 -- 4.查询数据库名称为security ?…

81.SAP ME - SAP SMGW Getway Monitor

目录 1.起因 2.SMGW Displaying Logged On Clients Displaying Remote Gateways Display and Control Existing Connections Deleting a Connection Displaying Gateway Release Information Displaying Parameters and Attributes of the Gateway Change Gateway Pa…

js中的ajax【Axios,XMLHttpRequest,Promise,async】回调函数地狱等问题

目录 前置知识 1.什么是异步请求? 2.什么是回调函数 3.如何查看网页的异步请求(XHR)? 4.什么是ajax jquery的ajax,xhr,axios关系 正文---几种请求之间的关系 axios Axios的诞生 Axios的介绍 定义…

Idea绿色下载安装教程-最新,2024版本通用-附下载链接

插件链接: 脚本 Idea下载安装完成后 进入激活码输入页面,然后关闭IDEA 按照下面流程进行激活 1. 按照以下步骤,亲测可用,记得一定要先关闭idea 2. 选择对应软件 3.选择bin、目录对应选项 5.激活 6.成功

ROS2 Humble 学习【openEuler】

ROS2 Humble 学习 1 介绍1.1 概述1.2 ROS2 详细介绍1.3 openEuler 安装 ROS2 Humble1.4 ROS2 系统架构 2 ROS2 基础2.1 节点编写、编译、运行【简单示例】节点编写节点编译 g节点运行节点编译 make节点编译 CMakeLists.txtCMake依赖查找流程Python 依赖查找流程 2.2 节点交互、…

LeetCode | 441 | 排列硬币 | 二分查找

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 今天分享的是LeetCode中一道标签为简单的算法题,本质是一道数学题 文章目录 1.题目描述2.题解2.1 公式解法2.2 暴力解法2.3 二分查找 LeetCode链接&#…

【51单片机仿真】基于51单片机设计的钟表定时闹钟系统仿真源码设计文档演示视频——完整资料下载

演示视频 设计内容 (1)使用 DS1302 结合字符型 LCD12864 显示器设计一个简易的定时闹钟 LCD 时钟。程序执行后 LCD 显示“00:00:00” (2)K1—设置现在的时间,年闪烁,再按 K1 键月闪…

15.75.【C语言】表达式求值

目录 一.整型提升 1.定义 2. 一.整型提升 1.定义 C语言中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升 2.整型提…

njs、nginx JavaScript、在nginx上写JavaScript、nginx支持js

njs、nginx JavaScript、在nginx上写JavaScript、nginx支持js 现在是 2024-08-05 ,在一个月前,我逛nginx官网,还没有这个模块的介绍。看njs官网,在四年前已经创建这个项目。不知道是不是近期才把这个项目纳入。以前不知道这模块&…

C# 构建观测者模式(或者为订阅者模型)

前言: 观测者模型的基本理念,就是,我有一个公共的事件,定义好他的事件的触发、数据接口。然后,通过增加订阅者(实例)来订阅这个事件的,或者说观察这个事件。如果事件发生&#xff0…

未授权访问漏洞系列详解⑥!

JBoss未授权访问漏洞 JBoss是一个基于J2EE的开放源代码应用服务器,代码遵循LGPL许可,可以在任何商业应用中免费使用;JBoss也是一个管理EJB的容器和服务器,支持EJB1.1、EJB 2.0和EJB3规范。,默认情况下访问 http://ip:8080/jmx-console 就可以…

【Java数据结构】---初始数据结构

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 前言 从今天开始我们就要学习Java…