synchronized 和 ReentrantLock (Lock)区别,优劣对比

news/2024/9/26 4:24:57

两种方法都是为了确保多线程环境中的线程安全,但它们使用了不同的同步机制:synchronized 关键字和 Lock 接口。下面详细对比这两种方法的区别、优缺点以及适用场景。

synchronized 关键字

public synchronized void addSession(HttpSession session) {if (session != null) {sessionMap.put(session.getId(), session);}
}

优点

  1. 简单易用:synchronized 关键字内置于 Java 语言中,使用方便,容易理解。
  2. 隐式锁:锁的获取和释放由 JVM 自动管理,不需要显式的解锁操作,减少了编程错误的可能性。
  3. 异常处理:锁的释放是自动的,即使抛出异常也会自动释放锁,避免了死锁的风险。

缺点

  1. 灵活性低:无法中断正在等待的线程,除非超时(使用 wait 和 notify 机制)。
  2. 性能问题:在高并发情况下,synchronized 的性能可能不如 Lock 接口,因为 synchronized 只能是阻塞的,无法实现更高级的并发控制。
  3. 不可尝试获取锁:不能尝试获取锁,并在获取不到时执行其他逻辑。

Lock 接口

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Example {private final Lock lock = new ReentrantLock();public void addPlayer(Integer userId, Integer rating, Integer selected_bot_id) {lock.lock();try {players.add(new Player(userId, rating, selected_bot_id, 0));} finally {lock.unlock();}}
}

优点

  1. 灵活性高:提供了多种锁获取模式(可中断、不可中断、限时等待等),适用于更复杂的并发控制。
  2. 性能好:在高并发环境中,Lock 接口的性能可能优于 synchronized,特别是在需要频繁锁定和解锁的情况下。
  3. 可尝试获取锁:可以尝试获取锁,并在获取不到时执行其他逻辑,避免长时间等待。

缺点

  1. 复杂性高:需要显式地获取和释放锁,容易出现忘记解锁的编程错误,从而导致死锁。
  2. 异常处理复杂:需要在 finally 块中显式释放锁,增加了代码的复杂性。

对比总结

image

使用场景

synchronized
适用于简单的同步需求,代码块较短,锁竞争不激烈的情况。
适合初学者,简单易用,降低编程错误。
Lock 接口:
适用于复杂的并发控制需求,代码块较长,锁竞争激烈的情况。
需要更高的性能和灵活性,能处理更多并发场景(如可中断锁、限时锁等)。

结论

选择 synchronized:如果你的同步需求较简单,代码块较短且锁竞争不激烈,使用 synchronized 更加方便且安全。

选择 Lock 接口:如果你的同步需求较复杂,代码块较长且锁竞争激烈,使用 Lock 接口可以提供更高的性能和灵活性。

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

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

相关文章

振弦采集仪在桥梁工程中的应用与发展趋势

振弦采集仪在桥梁工程中的应用与发展趋势 振弦采集仪作为一种精密的传感器测量设备,在桥梁工程中扮演着至关重要的角色,它通过监测桥梁结构的振动频率和弦张力变化来评估结构的健康状况和承载能力。随着桥梁工程技术的不断进步和智能化趋势的发展,振弦采集仪的应用日益广泛,…

验证码的识别和运用

验证码的主要目的是强制人机交互来抵御机器自动化攻击,为了确保服务器系统的稳定和用户信息的安全,越来越多的网站采用了验证码技术。图片验证码是目前最常用的一种,本文也主要讨论这种验证码的识别。最近在一个爬虫项目中遇到了验证码,需要机器自动识别绕过。这些验证码大…

[转帖]Redis如何绑定CPU

https://wenfh2020.com/2023/10/08/https/ 发布时间:2022-03-08 09:44:39 阅读:649 作者:小新 栏目:开发技术 开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>> 这篇文章主要介绍了Redis如何绑定CPU,具有一定借鉴价值,感兴趣的朋友可以…

【日记】梦到兄长要给鳄鱼换牙齿……(421 字)

正文今天中午睡了一个小时多一点,做了一个很奇怪的梦。梦见兄长要给一条鳄鱼换牙齿,还说早上不好操作,要三天之后的中午或晚上,颇有一种翻黄历寻个良辰吉日之感。但我没那样大的耐性,便捏住鳄鱼的嘴,左摔右摔给它摔晕了,叫哥哥来换。兄长说摔晕了没意思,后面记不清了。…

如何修改docker容器的重启策略(重启模式)?

如何修改docker容器的重启策略(重启模式)? 使用命令进行修改: docker container update --restart=unless-stopped mongodb示例: 执行命令:执行后成功的结果:Docker容器的重启策略Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。 Dock…

ToDesk勾上摄像头会看到我吗?如何关闭摄像头

ToDesk远程控制软件除了能跨系统跨设备进行远控连接外,其实还有很多实用的小功能在日常生活派上用场。 就比如远程摄像头,可以用来远程查看被控电脑的环境情况,用来监控家里宠物和小孩的情况等等。可能很多小伙伴使用的时候会顾虑,远程开启摄像头后是否会看到主控端的本人?…

ToDesk云电脑性能如何?价格划算吗?

云电脑是最近兴起的一种新型计算机形态。当用户面临电脑配置太低,无法顺畅打开大型软件,满足不了日常玩游戏或者高性能渲染,这时候你只需要租借一个高配置的云电脑。 不需要额外购入任何设备,在原来的电脑上下载云电脑的软件,通过网络连接就能在云端上使用云电脑,轻轻松松…

Android案例分享,基于瑞芯微RK3568国产平台!

开发环境说明 Windows开发环境:Windows7 64bit、Windows10 64bit 虚拟机:VMware15.5.5 AndroidSDK编译环境:Ubuntu18.04.4 64bit Android Studio版本:android-studio-2022.3.1.19(Windows版本) Android系统:Android 13 AndroidSDK:Rockchip_Android13_SDK_Release硬件平…