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…

阿里巴巴商家爬虫工具 1688采集软件使用教程

【简介】本文将介绍一款基于Python的阿里巴巴商家爬虫工具,能够帮助用户采集1688网站上的商家信息,并附带具体代码实例,方便读者快速上手。 【正文】 一、准备工作 确保你已经安装了Python,并配置好环境变量。在命令行中安装必…

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. 信号阻塞…

智能手机“卷向”AI

当前,智能手机已然成为了人们日常生活中最重要的电子设备之一,只需要一部手机,人们的衣食住行需求就可以通通满足。可以说,此前仅仅作为单纯的通讯工具的手机,已经发展成为了当下时代中不可或缺的存在。在智能手机行业…

新装idea后的常用配置

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

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

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

鸿蒙开发之gson解析

作为老牌的Java程序员,几乎每个项目都逃不掉fastjson/gson等三方库。那么在OpenHarmony/HarmonyOS应用开发中,做数据解析时能不能使用fastjson/gson三方库呢?于是我搜索了一下,其实在arkts开发过程中也是可以使用JS里自带的JSONparse和JSONstringify方法来实现JSON和对象转…

monkey事件

操作事件简介 Monkey所执行的随机事件流中包含11大事件,分别是触摸事件、手势事件、二指缩放事件、轨迹事件、屏幕旋转事件、基本导航事件、主要导航事件、系统按键事件、启动Activity事件、键盘事件、其他类型事件。Monkey通过这11大事件来模拟用户的常规操作,对手机App进行…

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年道路运输企业安全生产管理人员复审考试为正在备考道路运输企业安全生产管理人员操作证的学员准备的理论考试专题,每个月更新的道路运输企业安全生产管理人员模拟考试题祝您顺利通过道路运输企业安全…