java多线程实现同步的方式介绍

        在 Java 多线程编程中,同步是确保多个线程在访问共享资源时的正确性和一致性的重要机制。Java 提供了多种方式来实现线程同步,每种方式都有其特点和适用场景。以下是一些常见的同步方式及其特点和应用场景,以及简单的例子来说明它们的用法。


        1. `synchronized` 关键字
        特点
- 自动锁定和释放锁。
- 支持重入。
- 非公平锁。
- 只能用于实例方法和静态方法。
        应用场景
- 简单的同步需求,如同步方法或代码块。
        例子
        

public class SynchronizedExample {private int count = 0;public synchronized void increment() {count++;}public static void main(String[] args) {SynchronizedExample example = new SynchronizedExample();Thread t1 = new Thread(example::increment);Thread t2 = new Thread(example::increment);t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Count is: " + example.count);}
}


        
        2. `ReentrantLock` 类
         特点
- 需要手动锁定和解锁。
- 支持公平锁和非公平锁。
- 提供了比 `synchronized` 更灵活的锁定机制,如尝试锁定和条件等待。
        应用场景
- 需要更灵活锁定策略的场景,如尝试锁定或条件锁定。
        例子
        

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {private Lock lock = new ReentrantLock();private int count = 0;public void increment() {lock.lock(); // 获取锁try {count++;} finally {lock.unlock(); // 释放锁}}public static void main(String[] args) {ReentrantLockExample example = new ReentrantLockExample();Thread t1 = new Thread(example::increment);Thread t2 = new Thread(example::increment);t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Count is: " + example.count);}
}


        
        3. `synchronized` 块
        特点
- 手动锁定和解锁。
- 支持重入。
- 非公平锁。
- 可以用于任何代码块。
        应用场景
- 当只需要同步代码块而不是整个方法时。
         例子
        

public class SynchronizedBlockExample {private int count = 0;private final Object lock = new Object();public void increment() {synchronized (lock) {count++;}}public static void main(String[] args) {SynchronizedBlockExample example = new SynchronizedBlockExample();Thread t1 = new Thread(example::increment);Thread t2 = new Thread(example::increment);t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Count is: " + example.count);}
}


        
        4. `volatile` 关键字
        特点
- 确保变量的可见性。
- 禁止指令重排。
- 只能用于变量,不能用于方法或代码块。
        应用场景
- 当多个线程只需要读写单个共享变量时。
        例子
        

public class VolatileExample {private volatile boolean flag= true;public void run() {while (flag) {System.out.println("Thread " + Thread.currentThread().getId() + " is running");}}public static void main(String[] args) throws InterruptedException {VolatileExample example = new VolatileExample();Thread t1 = new Thread(example::run);Thread t2 = new Thread(example::run);t1.start();t2.start();// 主线程休眠一段时间Thread.sleep(500);// 更改 flag 的值,使 t1 线程停止example.flag = false;}
}


        
        5. `AtomicInteger` 类
        特点
- 提供原子操作的整数类。
- 支持自增、自减等原子操作。
- 非公平锁。
        应用场景
- 当需要对整数进行原子操作时,如计数器。
         例子
        

import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerExample {private AtomicInteger count = new AtomicInteger(0);public void increment() {count.incrementAndGet();}public static void main(String[] args) {AtomicIntegerExample example = new AtomicIntegerExample();Thread t1 = new Thread(example::increment);Thread t2 = new Thread(example::increment);t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Count is: " + example.count);}
}


        
        6. `CountDownLatch`、`CyclicBarrier` 和 `Semaphore` 类
        特点
- 这些类提供了线程间的协调和同步机制。
- `CountDownLatch` 允许一个或多个线程等待直到一组操作执行完毕。
- `CyclicBarrier` 允许一组线程相互等待,直到所有线程都达到某个屏障点。
- `Semaphore` 用于限制可以同时访问某个资源的最大线程数。
        应用场景
- 当需要线程间的协调和同步时,如多个线程完成任务后再执行下一步操作。
        例子(`CountDownLatch`)
        

import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {private CountDownLatch latch = new CountDownLatch(2);public void performTask() {try {latch.await(); // 等待直到计数器下降到 0System.out.println("All tasks are completed");} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {CountDownLatchExample example = new CountDownLatchExample();Thread t1 = new Thread(example::performTask);Thread t2 = new Thread(example::performTask);t1.start();t2.start();// 主线程休眠一段时间try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}// 计数器减到 0,使等待的线程继续执行example.latch.countDown();example.latch.countDown();}
}


        
        总结
        Java 提供了多种同步机制,包括 `synchronized` 关键字、`ReentrantLock`、`synchronized` 块、`volatile` 关键字、`AtomicInteger` 类以及 `CountDownLatch`、`CyclicBarrier` 和 `Semaphore` 类。每种机制都有其特点和适用场景。`synchronized` 关键字和 `ReentrantLock` 用于锁定代码块或方法,确保多线程对共享资源的独占访问。`volatile` 关键字用于确保变量的可见性和有序性。`AtomicInteger` 类提供了一种原子性的整数操作,适合于计数器等场景。而 `CountDownLatch`、`CyclicBarrier` 和 `Semaphore` 类则用于线程间的协调和同步,它们通过不同的机制来控制线程的执行流程。
        在实际应用中,选择合适的同步机制取决于具体的需求和场景。例如,如果你需要一个简单的锁机制,`synchronized` 关键字或 `ReentrantLock` 都是不错的选择。如果你需要对单个变量进行原子操作,`volatile` 关键字或 `AtomicInteger` 类会更加适合。而当你需要线程间的协调,例如等待所有线程完成任务后再继续执行时,`CountDownLatch`、`CyclicBarrier` 或 `Semaphore` 类会更加适合。

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

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

相关文章

低成本便捷使用最新Claude 3模型的方法!

3 月 4 日,被称为 OpenAI 最强竞争对手的大模型公司 Anthropic 宣布推出 Claude3 系列模型,与 Gemini 类似,模型按照大小分为三个:Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。Opus 目前在官方发布的测试成绩中全方位超越…

电脑主机弄丢后赔偿却还收150元费用?

“电脑主机丢失后,我被收取了150元的赔偿费。” 22日,家住临沂市沂水县龙家泉镇的吴女士拨打热线电话反映,家里电脑主机出现问题,她把电脑放在镇上的一家店里。 我去电脑维修店修好了,对方丢了,但他们还是收…

vscode中eslint插件不生效问题

case: 最近使用webpack打包js资源中使用到了VS Code中的eslint插件辅助eslint plugin对代码进行校验,在.eslintrc.js文件中以及webpack.config.js配置好后, 在控制台运行npx webpack可以读取到eslint plugin的检测结果 一、eslint插件读取项目中.eslint…

Nodejs 第五十三章(serverLess)

什么是serverLess? serverLess并不是一个技术,他只是一种架构模型,(无服务器架构),在传统模式下,我们部署一个服务,需要选择服务器Linux,windows等,并且还要安装环境,熟悉操作系统命令,知晓安…

如何提高LED工程预算的准确性?

LED工程预算的准确性对工程的顺利进行至关重要。预算过高会导致资源浪费,甚至滋生腐败问题;而预算过低则会导致施工进度受阻,影响工程质量和人员工资发放。因此,提高LED工程预算的准确性是工程管理中的重要课题。 以下是一些提高L…

部署YOLOv8模型的实用常见场景

可以的话,GitHub上点个小心心,翻不了墙的xdm,csdn也可以点个赞,谢谢啦 车流量检测(开源代码github): test3 meiqisheng/YOLOv8-DeepSORT-Object-Tracking (github.com) 车牌检测&#xff0…

Vue3.2 + vue/cli-service 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案

chunk-vendors.js 是/node_modules 目录下的所有模块打包成的包, 但是这包太大导致页面加载很慢(我的都要3-4秒了), 这个时候就会出现白屏的情况 解决方案 1、compression-webpack-plugin 插件解决方案 1)、安装 npm …

【linux进程信号(二)】信号的保存,处理以及捕捉

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 进程信号 1. 前言2. 信号阻塞…

新装idea后的常用配置

(所有为idea new project配置默认配置的都是 File -> New Projects Settings -> Settings for New Projects) 1. 修改编码格式 大多数软件默认编码都是GBK,还有其他的,不过我们都是使用UTF-8的,这里统一设置为…

Python 语句(二)【循环语句】

循环语句允许执行一个语句或语句组多次,其程序流程图如下: 在python中有三种循环方式: while 循环 当判断条件为 true 时执行循环体,否则退出循环体。for 循环 重复执行语句嵌套循环 (在while循环体中嵌套for循环&…

Java - Spring MVC 实现跨域资源 CORS 请求

据我所知道的是有三种方式:Tomcat 配置、拦截器设置响应头和使用 Spring MVC 4.2。 设置 Tomcat 这种方式就是引用别人封装好的两个 jar 包,配置一下web.xml就行了。我也并不推荐,这里放两个我在网上找到的配置相关文章,感兴趣可…

Netty架构

Netty逻辑架构 Netty 的逻辑处理架构为典型网络分层架构设计,网络通信层、事件调度层、服务编排层。 一、 网络通信层 网络通信层的职责是执行网络 I/O 的操作。它支持多种网络协议和 I/O 模型的连接操作。当网络数据读取到内核缓冲区后,会触发网络事件…

OSPF NSSA实验简述

OSPF NSSA实验简述 1、OSPF NSSA区域配置 为解决末端区域维护过大LSDB带来的问题,通过配置stub 区域或totally stub区域可以解决,但是他们都不能引入外部路由场景。 No so stuby area (区域)NSSA 可以引入外部路由,支持…

北斗卫星技术助力环卫车智能化改造

北斗卫星技术助力环卫车智能化改造 在现代城市环境中,环卫工作一直是一项重要的公共服务,而环卫车则是环卫工作的重要工具之一。随着科技的不断发展和进步,北斗卫星技术的应用逐渐走进了人们的视野,为环卫车的智能化改造提供了全…

2024年【道路运输企业安全生产管理人员】复审考试及道路运输企业安全生产管理人员模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年道路运输企业安全生产管理人员复审考试为正在备考道路运输企业安全生产管理人员操作证的学员准备的理论考试专题,每个月更新的道路运输企业安全生产管理人员模拟考试题祝您顺利通过道路运输企业安全…

脉宽调制PWM控制器有哪些国产替代可选择?

一、脉宽调制PWM简介 PWM的理论基础为面积等效原理,这个原理简单描述就是冲量相等(信号对时间的积分,即面积)而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量相等而形状不同的窄脉冲加在具有惯性的环…

虾皮、lazada店铺运营攻略,如何搭建高效、稳定的自养号测评系统

随着电子商务的蓬勃发展,越来越多的人选择在虾皮这样的电商平台上开设店铺,以实现创业梦想。但如何在众多店铺中脱颖而出,成为消费者的首选?本文将为您详细解答“怎么样做好虾皮店铺”,并提供一些实用的运营建议。 一、怎么样做…

【文献计量】安装endnote注意事项

1.前言 EndNote 是一款广受学者、研究人员、学生和图书管理员等使用的参考管理软件。它由 Clarivate Analytics 开发,用于管理文献引用和编排参考文献列表。EndNote 可以帮助用户在撰写科研论文、书籍或任何学术出版物时,高效地组织、管理和引用研究资料…

C++ 有边数限制的最短路 Bellman_ford算法(带负权边)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。 请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible。 注意:图中可能 存在负权回路…

第3部分 原理篇3可验证凭证(VC)(1)

3.3. 可验证凭证 3.3.1. 本节内容概述 本聪老师:今天开始去中心化身份中另一个最重要的概念可验证凭证(verifiable credential)的学习。凭证,也就是证件,在人类生活中不可或缺。可验证凭证实现了凭证的机器可读、加密…