Java多线程编程中的线程同步

news2024/11/26 2:52:51

Java多线程编程中的线程同步

基本概念:

线程同步是多线程编程中的一个重要概念,用于控制多个线程对共享资源的访问,以防止数据的不一致性和并发问题。
在多线程环境下,多个线程同时访问共享资源可能导致数据的竞争和不正确的结果。


线程同步的目的:

是确保多个线程按照特定的顺序和规则访问共享资源,以保证数据的正确性和一致性。


以下是一些常见的线程同步机制:

  1. synchronized 关键字: 使用 synchronized 关键字可以在方法或代码块中标记为同步,确保同一时刻只有一个线程可以执行被标记的代码块。这可以防止多个线程同时访问被同步的资源。

    示例:

    public synchronized void synchronizedMethod() {
        // 同步的代码块
    }
    
  2. 对象锁: 在某些情况下,您可能需要使用特定的对象作为锁来控制同步。通过使用 synchronized 关键字来锁定特定的对象,可以确保多个线程之间对共享资源的访问是有序的。

    示例:

    public void someMethod() {
        synchronized (lockObject) {
            // 同步的代码块
        }
    }
    
  3. ReentrantLock 类: ReentrantLock 是 Java 提供的一个可重入锁类,它提供了更灵活的同步机制,比传统的 synchronized 关键字更加强大。

    示例:

    import java.util.concurrent.locks.*;
    
    Lock lock = new ReentrantLock();
    public void someMethod() {
        lock.lock();
        try {
            // 同步的代码块
        } finally {
            lock.unlock();
        }
    }
    
  4. volatile 关键字: volatile 关键字用于修饰变量,保证多个线程之间对该变量的读取和写入操作是可见的。虽然 volatile 关键字不能完全替代锁,但在某些情况下可以用于简单的线程同步需求。

    示例:

    private volatile int count = 0;
    
  5. 等待和通知机制: 使用 wait()notify()(或 notifyAll())方法可以实现线程之间的等待和通知机制,用于控制线程的执行顺序和资源的访问。

    示例:

    synchronized (lock) {
        while (condition) {
            lock.wait();
        }
        // 执行逻辑
        lock.notify();
    }
    

线程同步是多线程编程中必不可少的一部分,它可以帮助您避免数据竞争和并发问题,确保程序在多线程环境下的正确性和稳定性。不同的同步机制适用于不同的场景,我们可以根据具体的需求选择合适的方式来实现线程同步。


当涉及到线程同步时:

一个常见的示例是使用 synchronized 关键字来确保多个线程对共享资源的安全访问。以下是一个简单的示例,演示了如何使用 synchronized 来同步一个共享计数器

public class SynchronizedExample {

    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }

    public static void main(String[] args) {
        SynchronizedExample example = new SynchronizedExample();

        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                example.increment();
            }
        };

        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final count: " + example.getCount());
    }
}

输出结果如下:
在这里插入图片描述

​ 在这个示例中,我们创建了一个名为 SynchronizedExample 的类,其中包含一个共享的计数器 count。通过将 increment 方法和 getCount 方法标记为 synchronized,我们确保了在同一时刻只有一个线程可以访问这些方法,从而保证了计数器的安全访问。

​ 我们创建了两个线程来同时执行 increment 方法,每个线程都会将计数器增加 1000 次。通过调用 join 方法,我们等待这两个线程执行完毕后再输出最终的计数值。

​ 若是不添加上sychronized,则无法得到保障

在这里插入图片描述

在这里插入图片描述

可以看到几次的结果都不一样,没办法得到我们想要的答案。只有添加了同步锁,用于控制多个线程对共享资源的访问,才能防止数据的不一致性和并发问题。

总结


​ PS:这只是线程同步的一个简单示例,实际应用中可能涉及更复杂的场景和更多的同步机制。不过, 希望这个简单的示例可以帮助您理解如何使用 synchronized 来确保多线程环境下共享资源的安全访问。

作者:Stevedash

发表于:2023年8月14日 16点35分

来源:Java 多线程编程 | 菜鸟教程 (runoob.com)

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

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

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

相关文章

语聚AI如何通过对话方式让AI助手执行应用软件

1 什么是应用助手&#xff1f; 应用助手可以通过对话的方式让AI助手执行应用软件的操作。 例如&#xff0c;您可以调用“Bing搜索引擎搜索”热门信息&#xff0c;然后根据这些信息总结内容。 也可以使用“抖音”应用&#xff0c;搜索热门抖音视频&#xff0c;并根据热门视频生…

设置返回列表元素上限

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f;拾陆楼知识星球入口 在get_cell &#xff0c;get_nets&#xff0c;get_xx等操作时返回的值上限是100&#xff0c;后面的就用...省略了&#xff0c;如果要修改这个上限&#xff0c;需要用下面命令: s…

运动控制系统::几篇大佬的文章

运动规划 - 知乎 (zhihu.com) 运动规划、运动控制 & 运动感知 - 知乎 (zhihu.com)

管理类联考——逻辑——综合推理——汇总篇——要点

一、真话假话题 #mermaid-svg-gmlWWCoVLQr21gdi {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gmlWWCoVLQr21gdi .error-icon{fill:#552222;}#mermaid-svg-gmlWWCoVLQr21gdi .error-text{fill:#552222;stroke:#552…

C++之std::call_once实例(一百七十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Java 纠正上传图片自动旋转与镜像的问题

Java 纠正上传图片自动旋转与镜像的问题 遇到一个图片看着是方向是正的&#xff0c;但是用特定的工具打开后自动旋转与镜像。 查看这篇文章后&#xff1a;https://www.cnblogs.com/csonezp/p/5564809.html。 原文中的一句话&#xff1a;原来是因为相机给图片的exif信息加上了一…

商用汽车转向系统常见故障解析

摘要&#xff1a; 车辆转向系统是用于改变或保持汽车行驶方向的专门机构。其作用是使汽车在行驶过程中能按照驾驶员的操纵意图而适时地改变其行驶方向&#xff0c;并在受到路面传来的偶然冲击及车辆意外地偏离行驶方向时&#xff0c;能与行驶系统配合共同保持车辆继续稳定行驶…

面试涨薪神奇操作,直接多给3k的JVM垃圾优化笔记

对于一个线上系统来说&#xff0c;经常性的会发生如&#xff1a; 系统突然卡死&#xff0c;无法访问&#xff0c;甚至出现OOM。服务器的CPU负载突然升高。直接使用默认JVM参数上线&#xff0c;最终发现系统宕机。想要调整JVM参数&#xff0c;但是无从下手。。。。。 对于这些…

linux系统部署jenkins详细教程

一、Linux环境 1、下载war包 官网下载地址&#xff1a; https://get.jenkins.io/war-stable/2.332.4/jenkins.war 2、将war包上传至服务器 创建目录/home/ubuntu/jenkins 上传war包至该目录 3、将jenkins添加到环境变量 进入环境变量文件 vim /etc/profile # 文件下方追加…

RocketMQ双主双从同步集群部署

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

Opencv-C++笔记 (17) : 模板匹配

文章目录 1--概念2-- 方法3 结果3.1 ROI区域的获取使用自适应目标匹配 1–概念 opencv 提供了一个专门用于模板匹配的函数 cv::matchTemplate();其调用方式如下&#xff1a; void cv::matchTemplate(cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-Hcv::Inpu…

Python中的字符串与字符编码

Hello&#xff0c;这里是Token_w的博客&#xff0c;欢迎您的到来 今天文章讲解的是Python中的字符串与字符编码&#xff0c;其中有基础的理论知识讲解&#xff0c;也有实战中的应用讲解&#xff0c;希望对你有所帮助 整理不易&#xff0c;如对你有所帮助&#xff0c;希望能得到…

Linux怎样处理网络请求——彻底理解IO多路复用

常见的网络IO模型 网络 IO 模型分为四种&#xff1a;同步阻塞 IO、同步非阻塞IO、IO 多路复用、异步非阻塞 IO(Async IO, AIO)&#xff0c;其中AIO为异步IO&#xff0c;其他都是同步IO 同步阻塞IO 同步阻塞IO&#xff1a;在线程处理过程中&#xff0c;如果涉及到IO操作&…

计算机竞赛 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

设计HTML5表单

HTML5基于Web Forms 2.0标准对HTML4表单进行全面升级&#xff0c;在保持简便、易用的基础上&#xff0c;新增了很多控件和属性&#xff0c;从而减轻了开发人员的负担。表单为访问者提供了与网站进行互动的途径&#xff0c;完整的表单一般由控件和脚本两部分组成。 1、认识HTML…

boss直聘投简历的时候会使用的一些功能

切换地区选择自己要工作的区域 点击在线简历 --> 求职期望里面可以设置工作城市 屏蔽掉之前离职过的公司 点击设置 --> 点击隐私保护 我们最好这里手动屏蔽掉之前入职的公司 这个页面还支持设置Boss查看权限&#xff0c;屏蔽职类(比如不看中介的职位&#xff0c;不…

JetBrains学生正版全家桶授权(大学4年免费)获取教程-idea学生免费许可解决方法

JetBrains学生正版全家桶授权&#xff08;大学4年免费&#xff09;获取教程 文章目录 JetBrains学生正版全家桶授权&#xff08;大学4年免费&#xff09;获取教程一、学信网二、JetBrains学生认证三、idea下载四、idea添加许可证 一、学信网 1.打开学信网&#xff08;中国高等…

免费在线 GIF 制作器和图像编辑器

hi&#xff0c;大家好我是技术苟&#xff0c;每天晚上22点准时上线为你带来实用黑科技&#xff01;由于公众号改版&#xff0c;现在的公众号消息已经不再按照时间顺序排送了。因此小伙伴们就很容易错过精彩内容。喜欢黑科技的小伙伴&#xff0c;可以将黑科技百科公众号设为标星…

MySQL8安装和删除教程 下载源码 保姆级(Windows)

删除 停止Mysql服务 管理员的权限来运行cmd&#xff0c;输入 net stop MySQL80 注意你电脑上的MySQL服务不一定是MySQL80,MySQL80是默认的&#xff0c;不是怎么办?在services.msc中找即可 下载一个小工具 geek:Geek下载打开软件&#xff0c;在列表中找到图片中的两项 sc…

ViewFs And Federation On HDFS

序言 ViewFs 是在Federation的基础上提出的,用于通过一个HDFS路径来访问多个NameSpace,同时与ViewFs搭配的技术是client-side mount table(这个就是具体的规则配置信息可以放置在core.xml中,也可以放置在mountTable.xml中). 总的来说ViewFs的其实就是一个中间层,用于去连接不…