Java多线程相加保证结果的正确性

news/2024/5/17 20:21:46 标签: java, 开发语言, 多线程, 原子类, synchronized

方案1:synchronized

使用synchronized修饰相关函数,确保某一时刻只有一个增加变量的函数在运行,从而确保了结果的正确性

java">public class SharedResourceExample {
    private static int sharedNumber = 0;

    public static void main(String[] args) {
        // 创建多个线程进行加法操作
        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                for (int j = 0; j < 10000; j++) {
                    incrementSharedNumber();
                }
            }).start();
        }

        // 等待所有线程执行完毕
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出结果
        System.out.println("Final result: " + sharedNumber);
    }

    private synchronized static void incrementSharedNumber() {
        sharedNumber++;
    }
}

方案2:原子类 

Java提供了一些原子类(Atomic Classes),它们提供了原子性操作,即在单个操作中完成读取和写入,而不会被其他线程中断。

原子类的操作是不可分割的,也就是说,一个线程的原子操作不会被其他线程中断。这种特性使得原子类非常适合在多线程环境中保证共享变量的正确性。

java">import java.util.concurrent.atomic.AtomicInteger;

public class SharedResourceExample {
    private static AtomicInteger sharedNumber = new AtomicInteger(0);

    public static void main(String[] args) {
        // 创建多个线程进行加法操作
        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                for (int j = 0; j < 10000; j++) {
                    incrementSharedNumber();
                }
            }).start();
        }

        // 等待所有线程执行完毕
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出结果
        System.out.println("Final result: " + sharedNumber);
    }

    private  static void incrementSharedNumber() {
        sharedNumber.incrementAndGet();
    }
}

方案3:可重入锁

创建一个可重入锁对象 ReentrantLock(),在 incrementSharedNumber 方法使用了 ReentrantLock,在执行临界区代码之前调用 lock.lock() 来获取锁,确保同一时刻只有一个线程能够执行 sharedNumber++finally 块中的 lock.unlock() 用于释放锁,确保在发生异常时也能够正确释放锁。

java">import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SharedResourceExample {
    private static int sharedNumber = 0;
    private static final Lock lock = new ReentrantLock();

    public static void main(String[] args) {
        // 创建多个线程进行加法操作
        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                for (int j = 0; j < 10000; j++) {
                    incrementSharedNumber();
                }
            }).start();
        }

        // 等待所有线程执行完毕
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出结果
        System.out.println("Final result: " + sharedNumber);
    }

    private static void incrementSharedNumber() {
        lock.lock();  // 加锁
        try {
            sharedNumber++;
        } finally {
            lock.unlock();  // 释放锁
        }
    }
}


http://www.niftyadmin.cn/n/5092727.html

相关文章

如何从 Pod 内访问 Kubernetes 集群的 API

Kubernetes API 是您检查和管理集群操作的途径。您可以使用Kubectl CLI、工具(例如curl)或流行编程语言的官方集成库来使用 API 。 该 API 也可供集群内的应用程序使用。Kubernetes Pod 会自动获得对 API 的访问权限,并且可以使用提供的服务帐户进行身份验证。您可以通过使…

python树状打印项目路径

学习这个的需求来自于&#xff0c;我想把项目架构告诉gpt问问它&#xff0c;然后不太会打印项目架构&#x1f602; 联想到Linux的tree指令 import osclass DirectoryTree:def __init__(self, path):self.path pathdef print_tree(self, methoddefault):if method default:sel…

云原生场景下高可用架构的最佳实践

作者&#xff1a;刘佳旭&#xff08;花名&#xff1a;佳旭&#xff09;&#xff0c;阿里云容器服务技术专家 引言 随着云原生技术的快速发展以及在企业 IT 领域的深入应用&#xff0c;云原生场景下的高可用架构&#xff0c;对于企业服务的可用性、稳定性、安全性越发重要。通…

内部类及其作用

内部类是Java中一种定义在另一个类内部的类。它允许在一个类的内部定义另一个类&#xff0c;从而将类的逻辑组织得更加紧密和模块化。支持四种类型的内部类&#xff0c;它们分别是&#xff1a; 成员内部类&#xff08;Member Inner Class&#xff09;&#xff1a;成员内部类是…

Hadoop3教程(十一):MapReduce的详细工作流程

文章目录 &#xff08;94&#xff09;MR工作流程Map阶段Reduce阶段 参考文献 &#xff08;94&#xff09;MR工作流程 本小节将展示一下整个MapReduce的全工作流程。 Map阶段 首先是Map阶段&#xff1a; 首先&#xff0c;我们有一个待处理文本文件的集合&#xff1b; 客户端…

双节前把我的网站重构了一遍

赶在中秋国庆假期前&#xff0c;终于将我的网站&#xff08;https://spacexcode.com/[1]&#xff09;结构定好了&#xff0c;如之前所说&#xff0c;这个网站的定位就是作为自己的前端知识沉淀。内容大致从&#xff1a;前端涉及的基础知识分类汇总&#xff08;知识库&#xff0…

Windows:VS Code IDE安装ESP-IDF【保姆级】

物联网开发学习笔记——目录索引 参考&#xff1a; VS Code官网&#xff1a;Visual Studio Code - Code Editing. Redefined 乐鑫官网&#xff1a;ESP-IDF 编程指南 - ESP32 VSCode ESP-ID Extension Install 一、前提条件 Visual Studio Code IDE安装ESP-IDF扩展&#xf…

10.14~10.15verilog操作流程与Block Design

后面的那个是延时精度 verilog文件结构 文件名称与写的模板没有关系&#xff0c;这个文件名为P1,但模板名为andgate 但是如果是仿真文件&#xff0c;就需要开头的模板名和仿真文件名相同 .v是源文件&#xff0c;设计文件 .v在设计与sim里都有&#xff0c;静态共享&#xff0…