当前位置: 首页 > 知识库问答 >
问题:

解释的线程-每次im运行代码时都有不同的答案

郎河
2023-03-14

我试图创建10个线程,每个线程运行100.000次。因此,我做了一个循环,循环每一个线程。它应该每次递增静态x+1。

public class CAOS_thread_demo_5 extends Thread
    {
        public static int x = 0;
    
        public static void main(String[] args)
        {
        CAOS_thread_demo_5 humhum1 = new CAOS_thread_demo_5();
        CAOS_thread_demo_5 humhum2 = new CAOS_thread_demo_5();
        CAOS_thread_demo_5 humhum3 = new CAOS_thread_demo_5();
        CAOS_thread_demo_5 humhum4 = new CAOS_thread_demo_5();
        CAOS_thread_demo_5 humhum5 = new CAOS_thread_demo_5();
        CAOS_thread_demo_5 humhum6 = new CAOS_thread_demo_5();
        CAOS_thread_demo_5 humhum7 = new CAOS_thread_demo_5();
        CAOS_thread_demo_5 humhum8 = new CAOS_thread_demo_5();
        CAOS_thread_demo_5 humhum9 = new CAOS_thread_demo_5();
        CAOS_thread_demo_5 humhum10 = new CAOS_thread_demo_5();


        humhum1.start();
        humhum2.start();
        humhum3.start();
        humhum4.start();
        humhum5.start();
        humhum6.start();
        humhum7.start();
        humhum8.start();
        humhum9.start();
        humhum10.start();
        try
        {
            humhum1.join();
            humhum2.join();
            humhum3.join();
            humhum4.join();
            humhum5.join();
            humhum6.join();
            humhum7.join();
            humhum8.join();
            humhum9.join();
            humhum10.join();
        }
        catch(Exception e)
        {}

        System.out.println();
        System.out.println("*** the end ***");
        System.out.println("#### counter: " + x);
    }
    

    public void run()
    {
        for (int i = 0; i < 100000; i++) {
            x++;
        }
    }
}

共有1个答案

太叔坚
2023-03-14

首先,x++不是原子的:它是对增量值的读取,然后是对增量值的写入。其他线程可以在这些操作之间交错。

其次,您不能保证x以前更新的可见性:您不能保证看到其他线程编写的更新,因此线程可能只是践踏其他线程编写的值。您可以通过使xvolatile来解决这个问题,但这并不能解决原子性问题。

x++周围使用同步块(使用公共监视器,例如CAOS_Thread_Demo_5.Class);或者使用AtomicInteger,它保证了可见性,并提供了原子增量方法(GetAndIncrement()IncrementAndGet())。

 类似资料:
  • 我为PHP代码设置了一个Cron作业,使其每20分钟运行一次。但它每次都会杀死EC2T2Micro实例。以下是服务器日志。Pls帮助。 ip-172-31-42-52登录:[20332.164336]内存不足:杀死进程1241(java)得分174或牺牲子 [20332.192538]杀死进程1241(java)总计-VM:1473180KB,Anon-RSS:176012KB,文件-RSS:0K

  • 我尝试在每次创建活动时运行以下线程。它第一次工作,但如果我按下后退按钮并尝试再次导航到活动,它总是崩溃第二次。我怎样才能确保这个线程每次都运行成功呢?

  • 问题内容: 我在尝试计算字符串的md5哈希值时遇到了一些非常奇怪的行为。如果我传递的是串联结果,则返回的哈希值总是错误的(且与众不同)。获得真正的哈希的唯一方法是传递创建后未进行任何修改的字符串。 我想念什么吗? 问题答案: 您缺少的是 不会替换散列数据 。您将不断更新哈希对象,因此您将获得 串联字符串 的哈希值。从文档中: 使用字符串 arg 更新哈希对象。 重复调用等效于将所有参数串联在一起的

  • 我对C语言编程有点陌生,我觉得用C语言做一个brainfuck解释器是学习这门语言的好方法。我可以用这些bf代码编写和测试: 这应该会打印一个hello world 这和预期的一样,所以我认为我的解释器工作得很好,但是当我用你好世界代码的几个变体进行测试时,奇怪的事情发生了。 这个bf代码也应该打印一个hello world,但它会打印出