AtomicInteger 线程安全

2024-04-02

我怎样才能实现这里的 while 循环总是恰好执行 100 次。当我执行代码时,在极少数情况下,它会在控制台上打印 99 或 98 行,而不总是 100 行,这是我不明白的。

import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;

public class Print implements Runnable {
    static AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public void run() {
        while (atomicInteger.getAndIncrement() < 100)
            System.out.println(Thread.currentThread());
    }

    public static void main(String[] args) throws InterruptedException {
        ArrayList<Thread> threads = new ArrayList<>();

        for (int i = 0; i < 5; i++)
            threads.add(new Thread(new Print()));

        for (Thread thread : threads)
            thread.start();

        for (Thread thread : threads)
            thread.join();
    }
}

无法复制您报告的体验。

在我心目中的调试器中,这似乎是正确的,因为我在代码中看不到任何线程安全错误。

为了自动化进一步测试,我按如下方式更改了您的代码。而不是打电话System.out.println,我将线程 ID 添加到List of Long。我把清单列出来了CopyOnWriteArrayList https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CopyOnWriteArrayList.html为了线程安全。我可以通过编程方式检测结果列表的大小是否不正好是 100 个元素。

package work.basil.demo;

import java.time.Instant;
import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;

public class Print implements Runnable
{
    static AtomicInteger atomicInteger = new AtomicInteger( 0 );
    static CopyOnWriteArrayList < Long > list = new CopyOnWriteArrayList <>();

    @Override
    public void run ( )
    {
        while ( atomicInteger.getAndIncrement() < 100 )
            //System.out.println(Thread.currentThread());
            list.add( Thread.currentThread().getId() );
    }

    public static void main ( String[] args ) throws InterruptedException
    {
        System.out.println( "INFO - demo starting. " + Instant.now() );
        for ( int cycle = 0 ; cycle < 1_000_000 ; cycle++ )
        {
            ArrayList < Thread > threads = new ArrayList <>();

            for ( int i = 0 ; i < 5 ; i++ )
                threads.add( new Thread( new Print() ) );

            for ( Thread thread : threads )
                thread.start();

            for ( Thread thread : threads )
                thread.join();

//            System.out.println( "list.size() = " + list.size() );
//            if ( list.size() == 100 ) { System.out.println( "DEBUG list.size() = " + ( list.size() ) ); }
            if ( list.size() != 100 ) { System.out.println( "DEBUG list.size() = " + ( list.size() ) ); }
        }
        System.out.println( "INFO - demo done. " + Instant.now() );
    }
}

在 Mac mini (2018) 3 GHz Intel Core i5(具有六个真正核心且无超线程)和 32 GB 2667 MHz DDR4 上运行时,使用 IntelliJ 中的 Java 16。跑步cycle到一百万大约需要 5 分钟。

INFO - demo starting. 2021-06-08T22:11:56.010181Z
INFO - demo done. 2021-06-08T22:16:26.982616Z

ExecutorService

顺便说一句,在现代 Java 中我们很少需要解决Thread直接上课。相反,使用执行者 https://docs.oracle.com/javase/tutorial/essential/concurrency/executors.htmlJava 5 中添加了框架。

这是上面代码的修订版本,重新调整以使用执行器服务。

public static void main ( String[] args ) throws InterruptedException
{
    System.out.println( "INFO - demo starting. " + Instant.now() );
    for ( int cycle = 0 ; cycle < 1_000_000 ; cycle++ )
    {
        ExecutorService executorService = Executors.newFixedThreadPool( 5 );

        int countTasks = 5;
        for ( int i = 0 ; i < countTasks ; i++ )
        {
            executorService.submit( new Print2() );
        }

        executorService.shutdown();
        executorService.awaitTermination( Duration.ofMinutes( 7 ).toSeconds() , TimeUnit.SECONDS );

//            System.out.println( "list.size() = " + list.size() );
//            if ( list.size() == 100 ) { System.out.println( "DEBUG list.size() = " + ( list.size() ) ); }
        if ( list.size() != 100 ) { System.out.println( "DEBUG list.size() = " + ( list.size() ) ); }
    }
    System.out.println( "INFO - demo done. " + Instant.now() );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AtomicInteger 线程安全 的相关文章

  • 中断并标签,“标签 MyLabel 丢失”

    我有这样的代码 if condition1 break MyLabel while true some code here MyLabel if condition2 break more code here 我收到此错误 标签 MyLab
  • 在 portlet 中设置 SearchContainer 以使用 EL 和 JSTL 在 JSP 中使用它

    我正在尝试使用SearchContainer在我的liferay应用程序中 目前我必须使用 JSP Scriplets 来设置results in
  • Spring安全+LocaleResolver

    我需要在身份验证成功后更改区域设置 区域设置解析器
  • 仅使用公钥在 HD 钱包中生成以太坊地址 (bitcoinj/web3j)

    我尝试为使用 bitcoinj 库实现的 HD 钱包密钥生成以太坊地址 但我感到困惑 DeterministicSeed seed new DeterministicSeed some seed code here null 1409478
  • Java:while循环冻结程序

    我正在制作一个游戏 我需要每 3 秒更新一次 JProgressBar 为此 我使用 while 循环 问题是我的程序由于 while 循环而冻结 我在其他问题中读到它 他们没有帮助我解决这个问题 我不知道如何解决 这是我的代码 publi
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • Eclipse 无法识别 persistence.xml 的内容

    我在 eclipse 中收到以下错误 persistence xml 文件没有可识别的内容 我的 persistence xml 文件在我的应用程序中工作得很好 但 eclipse 一直给我这个错误 我在移动文件并使用 m2eclipse
  • JTree ConvertValueToText 返回在更改时被截断

    我有一个自定义树实现convertValueToText 此实现取决于某些全局状态 如果返回的字符串比先前返回的字符串更长 实际上我认为更宽 因为以像素为单位触发它 则文本将被截断并用 填充 当重绘是由 取消 选择元素或某个元素引起时 情况
  • Eclipse RCP - 将视图与编辑器区域堆叠?

    在开发 Eclipse RCP 应用程序时 是否可以将视图与编辑器区域堆叠在一起 像这样 我有多个列表 表格 我想创建一种预览组合 当通过单击鼠标选择列表上的项目时 我希望我的预览合成显示该项目的数据 如果用户双击某个项目 我想在预览合成后
  • 合并和颜色样式不适用于 Apache POI excel 2003 格式

    在 Apache POI 中 我为某些单元格应用了一些样式并合并了这些单元格 当我在 2010 年或 2007 年打开时 它工作正常 但在 2003 年 格式样式消失了 每次保存 2003 Excel 文件之前都会弹出兼容性检查对话框 请参
  • Java 8 Stream - 并行执行 - 不同的结果 - 为什么?

    假设我有一个List
  • 不使用 length() 方法的字符串长度[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在不使用字符串的情况下找到字符串的长度length String类的方法 str toCharArray length应该管用 或者怎么
  • SQlite 获取最近的位置(带有纬度和经度)

    我的 SQLite 数据库中存储有纬度和经度的数据 我想获取距我输入的参数最近的位置 例如我当前的位置 纬度 经度等 我知道这在 MySQL 中是可能的 并且我已经做了相当多的研究 SQLite 需要一个自定义外部函数来实现半正弦公式 计算
  • 带等待/通知的同步块与不带等待/通知的同步块之间的区别?

    如果我只是使用synchronized 不是wait notify方法 它仍然是线程安全的吗 有什么不同 Using synchronized使方法 块一次只能由一个线程访问 所以 是的 它是线程安全的 这两个概念是结合在一起的 而不是相互
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • 在Java内存管理中,“PS”代表什么?

    每当我看到 Java 中对内存的引用时 各种空格总是以 PS 为前缀 PS 是什么意思 它开始困扰我 到目前为止我唯一的猜测是 泳池空间 但这将是多余的 例子 PS伊甸园空间 PS 幸存者空间 PS 终身空间 老一代 PS Perm Gen
  • 对于双核手机,availableProcessors() 返回 1

    我最近购买了一部 Moto Atrix 2 手机 当我尝试查看手机中的处理器规格时 Runtime getRuntime availableProcessors 返回 1 proc cpuinfo 也仅包含有关处理器 0 的信息 出于好奇
  • 空检查时可能未初始化错误

    我正在检查变量是否已初始化 但此时 netbeans 给了我variable reader might not have been initialized警告 我该如何解决 抑制这个问题 这是我的代码 摘要 final Reader rea
  • java中什么是静态接口?

    我正在阅读Map Entry界面 当我注意到它是一个static界面 我不太明白什么是静态接口 它与常规接口有什么不同 public static interface Map Entry
  • removeall 和removeif 的用例

    我找到了这个 fun main val list MutableList

随机推荐

  • SQL Server Management Studio 中的宏

    有没有办法在SSMS中实现文本编辑宏 我会 例如喜欢将代码转换为如下所示 但只需按键 而不是冗长的正则表达式搜索和替换 This INSERT INTO TABLE fieldOne fieldTwo VALUES
  • Learning Swift:顶层不允许使用表达式

    我正在学习斯威夫特 我遇到了一个无法解决的问题 import UIKit func helloword str String print str helloword say I use helloword say 但 Xcode 告诉我错误
  • “int '对象不可下标”

    我开始学习GEKKO 现在 我正在解决一个 knapsak 问题来学习 但是这次我收到错误 int object is not subscriptable 你能看一下这段代码吗 问题的根源是什么 我应该如何定义 1 10 矩阵 from g
  • SWI-Prolog - 显示长列表

    我正在使用 SWI Prolog 我正在尝试打印一个列表 但如果该列表有超过 9 个项目 它看起来像那样 1 15 8 22 5 19 12 25 3 有没有办法显示整个列表 看一下 http www swi prolog org FAQ
  • 在 Yii 框架中配置数据库连接

    在Yii框架的main php文件中 有一些配置选项 这就是mysql的设置方式 db gt array connectionString gt mysql host localhost dbname testdrive emulatePr
  • Pylint 警告:可能存在不平衡的元组按顺序解包

    我有一段Python代码 def func1 a set b join map str list a return b def func2 d 1 e 2 return func1 d e def main a b c d func2 if
  • Swift 中具有共享 NSUserDefaults 的 KVO

    我在通过通信 NSUserDefaults 更改在主机应用程序及其扩展之间进行通信时遇到问题 我初始化了NSUserDefaults using init suiteName 添加 KVO 观察者使用addObserver 方法并覆盖该方法
  • Lombok 未在 Netbeans 项目中工作

    我想在项目中使用Lombok来使用 Getter和 Setter 我包括使用 Maven
  • 显示图像的片段中的内存问题

    我正在使用片段来显示图像 页面 我有一个活动 主要 其中包含所有片段 package com example hscroll demo import android os Bundle import android preference P
  • 为 POCO 实施 IEquatable

    我注意到 EF 的 DbSet Add 非常慢 谷歌搜索了一下 找到了一个 SO 答案 承诺性能提升高达 180 倍 https stackoverflow com a 7052504 141172 https stackoverflow
  • 计算 SQL 中特定事件之前和之后的事件数量?

    我有一个包含日期和事件的表 有一个名为 A 的事件 我想知道 Sql Bigquery 中事件 A 之前和之后发生了多少个事件 例如 User Date Events 123 2018 02 13 D 123 2018 02 12 B 12
  • 从网络数据抓取类返回数据?

    我正在尝试创建一个类 它可以让我从网络服务获取请求的数据 我被困在如何返回值上 FooClass m DataGrabber is the class which is supposed to get values dataGrabber
  • R:使用矢量化按间隔分配值

    让我们有一个数字向量 a lt round runif 20 1 5 0 1 3 5 4 2 1 2 3 4 5 2 我需要使用如下表为这些数字分配值 1 to 2 assign A 3 to 4 assign B 5 assign C 这
  • Ruby Mixins 和实例变量

    是否有将参数传递给混合方法的最佳实践方法 使用 mixin 的类可以设置混合方法期望的实例变量 或者可以将所有必要的参数作为参数传递给混合方法 背景是我们有一个 Rails 控制器来发布内容 但其他控制器甚至模型都需要能够 充当发布者 所以
  • 错误“来源:系统进程已退出,因此请求的信息不可用”

    它在我的电脑上可以工作 但是当我放入另一台机器时 我收到错误 源 系统进程已退出 因此请求的信息不可用 并且 exe 没有出来 有哪位有经验的兄弟可以帮忙吗 赞赏 p New Process With p EnableRaisingEven
  • GooglePlayServices Admob 问题:“无法加载广告:0”

    我对新的 admob 有疑问 这是我的代码 尝试在我的主要活动中创建和加载广告 private void createAndLoadAd String adUnitID RelativeLayout rlRoot View upperVie
  • 如何创建在特定条件下对另一列进行计数的列?右

    下面 数据已被重新调整 并列出了输入和预期输出 Data structure list record id c 110101 110101 110101 110101 110101 110101 110101 110101 110101 1
  • 如何为 ruby​​ on Rails 创建 .htaccess?

    有谁知道创建 htaccess在铁轨上 请指导我 谢谢 regards 您只需在网站文档根目录中创建 htaccess 文件即可 在 apache 中 这将是您网站的文档根目录 可能类似于 var www your website com
  • 将 KeyVaultClient 与 MSAL 令牌“未经授权”结合使用

    桌面应用程序如何使用 Azure AD 读取 KeyVault 机密 我能够获取 MSAL 令牌 但将其交给 KeyVaultClient 始终会导致 Microsoft Azure KeyVault Models KeyVaultErro
  • AtomicInteger 线程安全

    我怎样才能实现这里的 while 循环总是恰好执行 100 次 当我执行代码时 在极少数情况下 它会在控制台上打印 99 或 98 行 而不总是 100 行 这是我不明白的 import java util ArrayList import