当前位置: 首页 > news >正文

Java中synchronized关键字、ReentrantLock、volatile关键字是如何实现线程同步的。

在Java中,synchronized关键字、ReentrantLock和volatile关键字这三个是编程中常用于实现线程同步的机制,下面结合代码详细说明一下这三个关键字的用法。

1. synchronized关键字:

synchronized关键字是Java语言提供的内置锁机制,用于实现线程之间的同步。它可以修饰方法或代码块,确保同一时刻只有一个线程可以访问被synchronized修饰的代码块或方法。示例

下面使用共同操作一个共享变量count演示一下synchronized的用法,代码如下:

public class SynchronizedExample {private int count = 0;public synchronized void increment() {count++;}public synchronized void decrement() {count--;}public static void main(String[] args) {SynchronizedExample example = new SynchronizedExample();Thread thread1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {example.increment();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {example.decrement();}});thread1.start();thread2.start();try {thread1.join();thread2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Count: " + example.count);  //Count: 0}
}

2. ReentrantLock:

ReentrantLock是java.util.concurrent包提供的锁机制,相比synchronized关键字更加灵活,可以实现公平锁、可中断锁等特性。使用ReentrantLock需要手动加锁和解锁

代码如下:

import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private int count = 0;private ReentrantLock lock = new ReentrantLock();public void decrement() {lock.lock();try {count++;} finally {lock.unlock();}}public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}public static void main(String[] args) {ReentrantLockExample example = new ReentrantLockExample();Thread thread1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {example.increment();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {example.decrement();}});thread1.start();thread2.start();try {thread1.join();thread2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Count: " + example.count); //Count: 0}
}

3. volatile关键字:

volatile关键字用于保证变量的可见性,即当一个线程修改了volatile变量的值,其他线程可以立即看到最新的值。但它并不具备原子性,不能保证复合操作的原子性。
代码如下:

public class VolatileExample {private volatile boolean flag = false;public void toggleFlag() {flag = !flag;}public static void main(String[] args) {VolatileExample example = new VolatileExample();Thread thread1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {example.toggleFlag();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {example.toggleFlag();}});thread1.start();thread2.start();try {thread1.join();thread2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Flag: " + example.flag);}
}

相关文章:

Java中synchronized关键字、ReentrantLock、volatile关键字是如何实现线程同步的。

在Java中&#xff0c;synchronized关键字、ReentrantLock和volatile关键字这三个是编程中常用于实现线程同步的机制&#xff0c;下面结合代码详细说明一下这三个关键字的用法。 1. synchronized关键字&#xff1a; synchronized关键字是Java语言提供的内置锁机制&#xff0c;…...

路由拦截器

路由拦截可以分为几种不同的类型&#xff0c;每种类型都有其特定的作用和适用场景。以下是常见的几种路由拦截类型及其用途&#xff1a; 身份验证拦截器&#xff1a; 作用&#xff1a; 检查用户是否已经登录或具有有效的身份认证&#xff0c;并根据认证状态决定是否允许用户访问…...

Springboot+vue的物业管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的物业管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的物业管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff…...

STM32的启动流程分析 和 一些底层控制的原理

阅读引言&#xff1a; 阅读本文之后&#xff0c; 你将对单片机&#xff0c; 甚至是嵌入式系统&#xff0c; 或者是传统的PC机系统的启动流程有一个大致的了解&#xff0c; 本文更加偏向于单片机的启动流程分析。 目录 一、基础知识 1.STM32系列的微控制器&#xff08;mcu&…...

C#面:几种注释类型

三种常见的注释类型&#xff1a;单行注释、多行注释和 XML 注释。 单行注释&#xff1a; 以双斜线 // 开头&#xff0c;用于在一行中注释单个语句或代码块。单行注释会被编译器忽略&#xff0c;不会对程序的执行产生任何影响。 例如&#xff1a; // 这是一个单行注释 int a…...

#onenet网络请求http(GET,POST)

参考博文&#xff1a; POST: https://blog.csdn.net/qq_43350239/article/details/104361153 POST请求&#xff08;用串口助手测试&#xff09;&#xff1a; POST /devices/1105985351/datapoints HTTP/1.1 api-key:AdbrV5kCRsKsRCfjboYOCVcF9FY Host:api.heclouds.com Con…...

零基础学习JS--基础篇--索引集合类

数组是由名称和索引引用的值构成的有序列表。 JavaScript 中没有明确的数组数据类型。但是&#xff0c;你可以使用预定义的 Array 对象及其方法来处理应用程序中的数组。Array 对象具有以各种方式操作数组的方法&#xff0c;例如连接、反转和排序。它有一个用于确定数组长度的…...

【硬件工程师面经整理25_AD】

文章目录 1 AD设计电路全流程2 ad和cadence区别-逻辑上的区别 1 AD设计电路全流程 软件AD or 模拟数字&#xff1f; 软件AD&#xff1a;AD设计电路全流程包括以下步骤&#xff1a;选择AD库和添加、画原理图、PCB布局、PCB布线、PCB打样、PCB加工 模拟数字&#xff1a; 需求分…...

神经网络的矢量化,训练与激活函数

我们现在再回到我们的神经元部分&#xff0c;来看我们如何用python进行正向传递。 单层的正向传递&#xff1a; 我们回到我们的线性回归的函数。我们每个神经元通过上述的方法&#xff0c;就可以得到我们的激发值&#xff0c;从而可以继续进行下一层。 我们用这个方法就可以得…...

3.7号freeRtoS

1. 串口通信 配置串口为异步通信 设置波特率&#xff0c;数据位&#xff0c;校验位&#xff0c;停止位&#xff0c;数据的方向 同步通信 在同步通信中&#xff0c;数据的传输是在发送端和接收端之间通过一个共享的时钟信号进行同步的。这意味着发送端和接收端的时钟需要保持…...

瑞芯微 | I2S-音频基础 -1

最近调试音频驱动&#xff0c;顺便整理学习了一下i2s、alsa相关知识&#xff0c;整理成了几篇文章&#xff0c;后续会陆续更新。 喜欢嵌入式、Li怒晓得老铁可以关注一口君账号。 1. 音频常用术语 名称含义ADC&#xff08;Analog to Digit Conversion&#xff09;模拟信号转换…...

Linux配置.bashrc文件导致各种命令(vim、sudo)失效。

Linux配置.bashrc文件导致各种命令&#xff08;vim、sudo&#xff09;失效。 起因是 nvcc-V一直报错&#xff1a;-bash&#xff1a;nvcc&#xff1a; command not found 踩坑记录&#xff1a;上网一查说是没有配置cuda的环境变量。于是去修改了bashrc文件&#xff0c;在最下面…...

Visual Studio 2022 Version 17.9 新功能

Visual Studio 2022 v17.9 为广大 C 开发者引入了一系列好用的新功能和改进优化。 内存布局 现在&#xff0c;你可以使用【内存布局&#xff0c;Memory Layout】功能以可视化的方式来查看对象&#xff0c;结构体及联合体的内存布局信息&#xff0c;这可比以前需要手动查看内存…...

ArrayList 和 LinkedList 的区别

ArrayList ArrayList 是基于动态数组实现的&#xff0c; 它使用一块连续的内存空间来存储元素&#xff0c;因此访问元素的速度非常快&#xff08;时间复杂度为 O(1)&#xff09;&#xff0c; 但是&#xff0c;在插入或删除元素时&#xff0c;如果位置不在数组末尾&#xff0…...

VGG16-CF-VGG11实验报告

说明:VGG16和CF-VGG11是论文《A 3D Fluorescence Classification and Component Prediction Method Based on VGG Convolutional Neural Network and PARAFAC Analysis Method》使用的两种主要模型。其对应代码仓库提供了实验使用的数据集、平行因子分析结果和CNN模型。论文和…...

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1638键盘…...

uniapp使用华为云OBS进行上传

前言&#xff1a;无论是使用华为云还是阿里云&#xff0c;使用其产品的时候必须阅读文档 1、以华为云为例&#xff0c;刚接触此功能肯定是无从下手的情况&#xff0c;那么我们需要思考&#xff0c;我们使用该产品所用到的文档是什么 2、我们要使用obs 文件上传&#xff0c;肯…...

用一个 Python 脚本实现依次运行其他多个带 argparse 命令行参数的 .py 文件

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 问题描述&#xff1a;在 Windows 环境中&#xff0c;您希望通过一个 Python 脚本来实现特定的自动化任务&#xff0c;该任务需要依次运行其他多个带 argparse 命令行参数的 .py 文件。您希望找到一种简…...

力扣热题100_普通数组_189_轮转数组

文章目录 题目链接解题思路解题代码 题目链接 189. 轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] …...

讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so

1.需求 最近linux下的Qt项目中要连接oracle数据库&#xff0c;用户需要我们访问他们的oracle数据库&#xff0c;查询数据 2.遇到的问题 qt连接oracle数据库需要oracle的驱动库libqsqloci.so插件&#xff0c;需要编译下&#xff0c;之前没有编译过&#xff0c;看了网上的…...

从搜索引擎到推荐系统:Dice和Jaccard相似性系数在真实业务场景中的应用与调优

从搜索引擎到推荐系统&#xff1a;Dice和Jaccard相似性系数在真实业务场景中的应用与调优 在信息爆炸的时代&#xff0c;如何在海量数据中快速找到最相关的内容&#xff1f;无论是搜索引擎中的查询匹配&#xff0c;还是推荐系统中的物品推荐&#xff0c;或是社交网络中的用户分…...

F12抓包实战:从浏览器Network面板到接口调试全解析

1. 浏览器F12抓包入门指南 第一次接触F12开发者工具时&#xff0c;我也被满屏的数据搞得头晕眼花。记得有次测试电商网站的购物车功能&#xff0c;开发同事请假了&#xff0c;文档也没更新&#xff0c;我只能硬着头皮用F12自己找接口。现在回想起来&#xff0c;掌握这个技能真…...

May协程库调优手册:如何正确配置协程栈大小

May协程库调优手册&#xff1a;如何正确配置协程栈大小 【免费下载链接】may rust stackful coroutine library 项目地址: https://gitcode.com/gh_mirrors/ma/may May是一个基于Rust的栈式协程库&#xff0c;它为开发者提供了轻量级的并发编程能力。由于May不支持自动栈…...

低查重AI教材写作秘籍:必备AI工具推荐,快速完成教材编写!

许多教材编写者常常感到遗憾&#xff0c;虽然他们对正文内容进行了精心打磨&#xff0c;但配套资源的缺失却使得整体教学效果受到影响。设计课后练习时往往缺乏创新的思路&#xff0c;制作直观的教学课件又因为技术能力不足而举步维艰&#xff0c;而对于案例的深入解析则因为时…...

深入S2A-Net的‘对齐卷积’:如何让卷积网络‘看懂’旋转的物体?

旋转物体检测的革命&#xff1a;S2A-Net如何用对齐卷积突破传统极限 当无人机从高空俯瞰大地&#xff0c;传回的图像中船只、车辆、飞机以各种角度随意分布&#xff1b;当卫星扫描地球表面&#xff0c;建筑物、桥梁、运动场呈现出千变万化的方向——这些场景对计算机视觉系统提…...

IgH EtherCAT 从入门到精通:第 15 章 TTY over EtherCAT

第 15 章 TTY over EtherCAT 导读摘要:IgH EtherCAT Master 提供了一个虚拟 TTY(终端设备)模块,允许通过 EtherCAT 过程数据通道传输串口数据。本章将讲解 TTY 模块的架构、接口定义、数据流机制以及实际使用方法,帮助你在 EtherCAT 网络中实现串口通信。 15.1 TTY 功能概…...

从轨迹抖动到稳定抓取:MuJoCo物理仿真中的三大核心挑战与解决方案

从轨迹抖动到稳定抓取&#xff1a;MuJoCo物理仿真中的三大核心挑战与解决方案 【免费下载链接】mujoco Multi-Joint dynamics with Contact. A general purpose physics simulator. 项目地址: https://gitcode.com/GitHub_Trending/mu/mujoco 你是否曾在机械臂控制中遇到…...

2025最权威的六大AI辅助写作神器解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术飞速发展的当下&#xff0c;AI辅助学术写作成了研究热点&#xff0c;借助AI撰写…...

用 Agent 自动化数据处理:从 2 小时到 15 分钟的效率革命

&#x1f4bb; 完整可运行代码&#xff1a; https://github.com/Lee985-cmd/AI-30-Day-Challenge ⭐ 如果觉得有用&#xff0c;欢迎 Star 支持&#xff01; 一、场景痛点&#xff1a;数据分析师的日常困境 真实场景还原 早上 9:00 - 收到老板邮件&#xff1a;"帮我分析一…...

3分钟搞定专业照片批量水印:告别繁琐手动操作

3分钟搞定专业照片批量水印&#xff1a;告别繁琐手动操作 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具&#xff0c;后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 还在为每张照片手动添加水印而烦恼吗&…...