synchronized关键字的作用、使用场景及锁升级过程。ReentrantLock与synchronized的区别及适用场景。

synchronized关键字的作用、使用场景及锁升级过程。

synchronized关键字的作用

synchronized是Java中的一个关键字,主要用于实现线程之间的同步。它的主要作用包括:

  1. 确保线程互斥地访问同步代码:当一个线程进入synchronized代码块或方法时,它将锁定该对象,其他线程需要等待锁释放后才能进入。这样可以确保在同一时间只有一个线程执行synchronized代码块或方法,从而避免多个线程同时修改共享资源导致的数据不一致或冲突的问题。

  2. 保证共享变量的可见性:synchronized除了实现互斥访问外,还可以保证共享变量的可见性。当一个线程释放锁时,会将对共享变量的更新刷新到主内存中,而当另一个线程获取锁时,会从主内存中重新读取最新的值,保证了线程间的数据可见性。

  3. 保证有序性:synchronized还可以确保代码的执行顺序。一个线程在执行完synchronized代码块或方法后,会释放锁并将对共享变量的修改刷新到主内存,而其他线程获取锁后会从主内存中重新读取最新的值。这样可以保证代码在不同线程间的执行顺序是按照预期的。

使用场景

synchronized常用于以下几种场景:

  1. 多线程需要访问同一资源:如文件、数据库连接或共享数据时,使用synchronized可以防止数据不一致或竞态条件的发生。

  2. 实现生产者-消费者问题、读写操作和初始化需求:在这些场景中,多个线程可能需要按照特定的顺序或规则来访问或修改数据,synchronized可以确保这些操作的正确执行。

  3. 需要对执行的操作进行排队,保证它们按顺序(串行)执行:在某些情况下,为了保证操作的顺序性,需要使用synchronized来同步线程的执行。

锁升级过程

在Java中,synchronized关键字的锁升级是指锁的状态从无锁状态到偏向锁状态,再到轻量级锁状态,最后到重量级锁状态的过程。这个过程是为了提高程序的性能和并发能力:

  1. 无锁状态:当一个线程访问一个同步代码块时,如果没有竞争,那么该线程可以直接进入临界区执行,不需要进行任何锁的操作。

  2. 偏向锁状态:当一个线程访问一个同步代码块时,如果没有竞争,那么该线程会将对象头中的标记位设置为偏向锁,并将线程ID记录在对象头中。下次该线程再次访问同步代码块时,无需进行任何锁的操作,可以直接进入临界区执行。

  3. 轻量级锁状态:当多个线程竞争同一个锁时,偏向锁会升级为轻量级锁。此时,每个线程会在自己的栈帧中创建一个锁记录(Lock Record)来保存锁对象的Mark Word,并尝试使用CAS(Compare and Swap)操作来获取锁。如果CAS操作成功,线程可以进入临界区执行;如果CAS操作失败,表示有其他线程竞争锁,那么线程会膨胀为重量级锁状态。

  4. 重量级锁状态:当多个线程竞争同一个锁时,轻量级锁会升级为重量级锁。此时,竞争锁的线程会进入阻塞状态,操作系统会将其挂起,直到锁被释放。其他线程再次竞争锁时,也会进入阻塞状态。

锁的升级过程是为了在无竞争的情况下尽量减少锁的操作和线程的切换,以提高程序的执行效率。只有在真正发生竞争时,才会升级为重量级锁,以保证线程的正确同步和互斥。

ReentrantLock与synchronized的区别及适用场景。

ReentrantLock与synchronized在Java并发编程中都是用于实现线程同步的重要机制,但它们之间存在一些关键的区别以及不同的适用场景。

一、区别

  1. 锁的获取与释放
    • synchronized:是Java的一个关键字,它隐式地获取和释放锁。当一个线程进入synchronized代码块或方法时,它会自动获取锁;当退出代码块或方法时,锁会自动释放。
    • ReentrantLock:是一个类,实现了Lock接口。它要求显式地调用lock()方法来获取锁,以及显式地调用unlock()方法来释放锁。
  2. 锁的公平性
    • synchronized:总是非公平锁,即无法保证等待时间最长的线程会首先获得锁。
    • ReentrantLock:可以设置为公平锁或非公平锁。在构造ReentrantLock时可以传入一个布尔值,true表示公平锁,false表示非公平锁(默认)。公平锁可以保证按照线程等待的先后顺序来获取锁。
  3. 响应中断
    • synchronized:不响应中断,即一个线程在等待锁的过程中,不能被中断。
    • ReentrantLock:提供了能够响应中断的锁获取操作,如lockInterruptibly()方法,允许在等待锁的过程中响应中断。
  4. 尝试非阻塞地获取锁
    • synchronized:没有提供尝试非阻塞地获取锁的机制。
    • ReentrantLock:提供了tryLock()方法,该方法尝试获取锁,如果获取成功立即返回true,否则返回false,不会使线程阻塞。
  5. 锁绑定多个条件
    • synchronized:与Object类中的wait()、notify()和notifyAll()方法结合,可以实现等待/通知机制,但这种方式较为原始且不够灵活。
    • ReentrantLock:提供了更加丰富的Condition API,每个ReentrantLock对象可以与一个或多个Condition对象(条件变量)关联,这为线程间的协调提供了更为灵活的控制。
  6. 性能
    • 在JDK 6及以后的版本中,synchronized的性能得到了显著提升,引入了偏向锁和轻量级锁等优化技术,使得synchronized在大多数场景下的性能与ReentrantLock相当甚至更优。
    • ReentrantLock在高度竞争的环境下,由于其提供了更灵活的尝试锁定和定时锁定等功能,可能会表现出更好的性能。

二、适用场景

  1. synchronized
    • 适用于简单的同步需求,如只需要基本的互斥访问控制。
    • 对性能要求较高,且不需要复杂同步特性的场景。
    • 开发者希望代码更加简洁,不需要手动管理锁的获取和释放。
  2. ReentrantLock
    • 适用于需要更复杂同步特性的场景,如需要公平锁、可中断锁、尝试非阻塞地获取锁等。
    • 在高度竞争和线程竞争激烈的场景下,ReentrantLock的性能可能优于synchronized。
    • 需要更灵活地控制线程等待和唤醒的场景,如使用多个Condition条件变量进行分组唤醒。

结论

ReentrantLock与synchronized各有优劣,选择哪种同步机制取决于具体的应用场景和需求。在简单的同步需求中,synchronized以其简洁性和良好的性能表现通常是首选;而在需要更复杂同步特性的场景中,ReentrantLock则提供了更灵活和强大的功能。

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

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

相关文章

视频集成与融合项目中需要视频编码,但是分辨率不兼容怎么办?

在众多视频整合项目中,一个显著的趋势是融合多元化的视频资源,以实现统一监管与灵活调度。这一需求促使项目团队不断探索新的集成方案,确保不同来源的视频流能够无缝对接,共同服务于统一的调看与管理平台,进而提升整体…

TI DSP TMS320F280025 Note13:CPUtimer定时器原理分析与使用

TMS320F280025 CPUtimer定时器原理分析与使用 ` 文章目录 TMS320F280025 CPUtimer定时器原理分析与使用框图分析定时器中断定时器使用CPUtimers.cCPUtimers.h框图分析 定时器框图如图所示 定时器有一个预分频模块和一个定时/计数模块, 其中预分频模块包括一个 16 位的定时器分…

【机器学习基础】Transformer学习

Transformer学习 梯度消失FeedForward层激活函数的主要作用是在网络中加入非线性变换 梯度消失 梯度爆炸 FeedForward层 Transformer结构: Transformer结构主要分为两大部分: 一是Encoder层结构:Encoder 的输入由 Input Embedding 和 Positional Embedding 求和输入Multi…

生产环境升级mysql流程及配置主从服务

之前写到过mysql升级8.4的文章, 因此不再介绍mysql的安装过程 避免服务器安装多个mysql引起冲突的安装方法_安装两个mysql会冲突吗-CSDN博客 生产环境升级mysql8.4.x流程 安装mysql 参考之前文章: 避免服务器安装多个mysql引起冲突的安装方法_安装两个mysql会冲突吗-CSDN博客…

Nmap网络扫描器基础功能介绍

怎么快速知道网络中存在哪些设备呢?我们可以借用扫描工具Nmap来实现这个功能。 下载 Windows系统可以前往Nmap官网下载安装包。 Linux使用对应的包管理器可以直接安装,命令如下 # Debian/Ubuntu apt install nmap# RedHat/Fedora yum install nmap …

Squaretest单元测试辅助工具使用

1、idea安装插件 Squaretest 然后关掉idea 2、安装字节码软件(jclasslib) 3、找到idea里面的Squaretest安装目录 找到包含TestStarter的jar包 4、打开 com.squaretest.c.f 打开后选择常量池 5、找到第16个修改 Long value值,修改的数字即为使…

Percona Monitoring and Management

Percona Monitoring and Management (PMM)是一款开源的专用于管理和监控MySQL、MongoDB、PostgreSQL

828华为云征文|华为云Flexus云服务器X实例部署——盲盒抽奖商城系统以及编译发布小程序

盲盒抽奖商城系统使用 thinkphp6.0 uniapp 开发,做到了全移动端兼容。一个系统不仅可以打包 小程序 还可以 打包APP ,H5 华为云Flexus云服务器X实例在安装搭建盲盒商城小程序方面具有显著优势,这些优势主要体现在以下几个方面: …

安卓13删除下拉栏中的关机按钮版本2 android13删除下拉栏关机按钮

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 顶部导航栏下拉可以看到,底部这里有个设置按钮,点击可以进入设备的设置页面,这里我们将更改为删除,不同用户通过这个地方进入设置。我们之前写过一个文章也是一样的删除…

数据结构之链表(2),双向链表

目录 前言 一、链表的分类详细 二、双向链表 三、双向链表的实现 四、List.c文件的完整代码 五、使用演示 总结 前言 接着上一篇单链表来详细说说链表中什么是带头和不带头,“哨兵位”是什么,什么是单向什么是双向,什么是循环和不循环。然后实…

数据结构-栈(理解版)

一、栈的定义 相信大家对于栈或多或少有一些了解,可能大多数人会告诉你栈是一种先进后出的数据结构。这其实说了跟没说一样(❁◡❁)!当然(last in,first out)是栈最有特色的性质。 这里可以给大家一些比较好理解的例…

大模型增量训练--基于transformer制作一个大模型聊天机器人

针对夸夸闲聊数据集,利用UniLM模型进行模型训练及测试,更深入地了解预训练语言模型的使用方法,完成一个生成式闲聊机器人任务。 项目主要结构如下: data 存放数据的文件夹 dirty_word.txt 敏感词数据douban_kuakua_qa.txt 原始语…

sqlserver迁移数据库文件存储位置

业务背景:由于C盘爆满,需要将数据库文件迁移到别处比如D盘 下面以某一个数据库转移为示例:(可以用SSMS工具,新建查询配合使用) 1.查询数据库文件存储路径 sql语句: -- 查询路径 USE QiangTes…

HarmonyOS/OpenHarmony 离线加载web资源,并实现web资源更新

关键词:h5离线包加载、h5离线包更新、沙箱 在上一篇文章中,我们已经介绍了如何将 rawfile 资源文件中的文件数据拷贝到沙箱下,那么该篇文章将介绍如何加载该沙箱目录下的文件资源(此处以打包后的web资源为例)&#xf…

Android 12系统源码_输入系统(三)输入事件的加工和分发

前言 上一篇文章我们具体分析了InputManagerService的构造方法和start方法,知道IMS的start方法经过层层调用,最终会触发Navite层InputDispatcher的start方法和InputReader的start方法。InputDispatcher的start方法会启动一个名为InputDispatcher的线程&…

linux驱动编程——等待队列

一、等待队列 可实现调用read函数时阻塞等。 1、流程 (1)初始化等待队列头(带参宏) init_waitqueue_head(q) 等待队列头wq数据类型: wait_queue_head_t,等待条件condition:int型变量。 &…

(c++)内存四区:1.代码区2.全局区(静态区)3.栈区4.堆区

//内存四区:1.代码区 2.全局区 3.栈区 4.堆区 1.放在代码区的有:1.写的代码:只读的、共享的、存放的二进制机器指令、由操作系统直接管理 2.放在全局区的有:1.全局的(变量或常量) 2.静态的&#xff0…

rdp远程桌面服务协议概述

rdp远程桌面服务协议概述 什么是远程桌面服务远程桌面服务的通信过程及功能 建立连接资源重定向与用户体验断开连接 远程桌面服务的协议架构 核心协议与基础通信虚拟通道与扩展协议协议协作与层次划分协议的可扩展性协议扩展与性能优化 总结参考 rdp远程桌面服务协议概述 对于…

SpringBoot(Java)实现MQTT连接(本地Mosquitto)通讯调试

1.工作及使用背景 工作中需要跟收集各种硬件或传感器数据用于Web展示及统计计算分析,如电表、流量计、泵、控制器等物联网设备。 目前的思路及解决策略是使用力控或者杰控等组态软件实现数据的转储(也会涉及收费问题),通过组态软件…

鸿蒙开发(NEXT/API 12)【应用间消息通信】手机侧应用开发

在手机侧与穿戴设备侧构建应用到应用的通信隧道,用于收发应用自定义的报文消息以及文件。实现手机应用和穿戴设备应用间的交互,为用户提供分布式场景和体验。比如手机应用发送音频文件到穿戴设备侧应用,实现在穿戴设备侧应用上播放音乐&#…