gpt4 book ai didi

java - 多线程访问内部类

转载 作者:行者123 更新时间:2023-11-29 06:35:23 26 4
gpt4 key购买 nike

我创建了 3 个线程,它们正在访问 ThreadsAroundInnerClasses 外部类的内部类 MyInnerClass

package com.test;public class ThreadsAroundInnerClasses {    public static void main(String[] args) {        Thread t1 = new Thread(new MyThread(), "THREAD-1");        Thread t2 = new Thread(new MyThread(), "THREAD-2");        Thread t3 = new Thread(new MyThread(), "THREAD-3");        t1.start();        t2.start();        t3.start();    }    static class MyInnerClass {        static int counter = 0;        public void printIt(String threadName) {            System.out.println("I am inside inner class, counter value is " + ++counter + " and thread name is " + threadName);        }    }}class MyThread implements Runnable {    @Override    public void run() {        ThreadsAroundInnerClasses.MyInnerClass innerObj = new ThreadsAroundInnerClasses.MyInnerClass();        innerObj.printIt(Thread.currentThread().getName());    }}

在输出中我可以看到 MyInnerClass 类中的 counter 静态变量没有按顺序更新。

I am inside inner class, counter value is 1 and thread name is THREAD-1I am inside inner class, counter value is 3 and thread name is THREAD-2I am inside inner class, counter value is 2 and thread name is THREAD-3

如果有人能解释一下在多线程的情况下内部类是如何处理的,那将会很有帮助吗?我们可以同步整个内部类吗?

在此先感谢您的帮助。

最佳答案

这个类是不是内部类是无关紧要的。您在这里看到的是预期的输出:您的程序中没有任何同步,因此线程调度程序可以在需要时自由切换到其他线程。这是可能的操作序列,它们会导致您看到的输出。

  1. T1 : 递增计数器
  2. T1 : 连接
  3. T1:打印
  4. T3 : 递增计数器
  5. T3 : 连接
  6. T2:递增计数器
  7. T2 : 连接
  8. T2:打印
  9. T3:打印

如果您希望计数器递增、连接和打印成为原子操作,那么您应该确保它在唯一锁上同步:

synchronized MyInnerClass.class {
System.out.println("I am inside inner class, counter value is " + ++counter + " and thread name is " + threadName);
}

关于java - 多线程访问内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21907831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com